私は少しユニークな問題を抱えています。SQLXml 変数と 2 つの文字列を取り込み、データを JSON 形式にシリアル化する SQL Server データベース内のアセンブリとして dll を登録しています。
参考までに、メソッド呼び出しは次のとおりです。
[SqlProcedure]
public static void Receipt(SqlString initiatorPassword,
SqlString initiatorId,
SqlXml XMLOut,
out SqlString strMessge)
これが他の種類のアプリである場合、このアプリケーションには Newtonsoft.Json または Jayrock を使用します。通常、私はここで与えられた答えに従い、次のようなことをします:
XmlReader r = (XmlReader)XmlOut.CreateReader();
XmlDocument doc = new XmlDocument();
doc.load(r);
ただし、SQLClr を使用しているため、一定のルールがあります。そのうちの 1 つはそれで.Load()
あり、他の継承されたメソッドは使用できません。 .Net フレームワークが最もよく言っていると思います。
System.InvalidOperationException: 動的に生成されたシリアル化アセンブリを読み込めません。一部のホスティング環境では、アセンブリの読み込み機能が制限されているため、事前に生成されたシリアライザーの使用を検討してください。詳細については、内部例外を参照してください。---> System.IO.FileLoadException:
LoadFrom()、LoadFile()、Load(byte[])、および LoadModule() がホストによって無効にされました。
私は決して SqlClr に精通しているわけではありませんが、このブログを正しく理解していれば、これは SqlCLR のルールが .Load() と継承されたメソッドを署名なしで許可せず、厳密な名前を持たないことが原因です。私の DLL と私が使用しているサード パーティの DLL には厳密な名前がなく、自分で再構築して署名することもできません。したがって、これにより、ロードを使用せずにこのタスクを完了しようとすることに行き詰まります(誰かがこれを行うことができる別の方法を知っていない限り)
私が思いついた唯一の解決策は、正しく機能していない非常に醜い while ループです。「Jayrock.Json.JsonException: JSON オブジェクト内の JSON メンバー値は、そのメンバー名の前に置く必要があります」という例外が発生しました。 . これが私が書いたwhileループです(私の最高のコードではありません、私は知っています):
int lastdepth = -1;
Boolean objend = true;
Boolean wt = false;
//Write Member/Object statements for the header omitted
JsonWriter w = new JsonTextWriter()
while (m.Read())
{
if ((lastdepth == -1) && (m.IsStartElement()))
{//Checking for root element
lastdepth = 0;
}
if ((m.IsStartElement()) && (lastdepth != -1))
{//Checking for Start element ( <html> )
w.WriteMember(m.Name);
if (objend)
{ //Check if element is new Parent Node, if so, write start object
w.WriteStartObject();
objend = false;
}
}
if (m.NodeType == XmlNodeType.Text)
{ //Writes text here. NOTE: m.Depth > lastdepth here!!!!!!!
w.WriteString(m.Value);
wt = true;
}
if (m.NodeType == XmlNodeType.Whitespace) //If whitespace, keep on truckin
{ m.Skip(); }
if ((m.NodeType == XmlNodeType.EndElement) && (wt == false) && (lastdepth > m.Depth))
{//End element that ends a series of "Child" nodes
w.WriteEndObject();
objend = true;
}
if ((m.NodeType == XmlNodeType.EndElement) && (wt == true))//Standard end of an el
{ wt = false; }
lastdepth = m.Depth;
}
w.WriteEndObject();
jout = w.ToString();
}
私の質問は、使用できず.load()
、while ループをデバッグするのが面倒なので、ここでの最善のアプローチは何でしょうか? 一般的に議論されているもう 1 つのアプローチは、一致する変数を使用したオブジェクトへの逆シリアル化ですが、SQL Server からかなり大きな XML が出力されます。この XML を作成するためにプルされるフィールドが 200 まであるため、私のループは動的プログラミングの試みです。
注: 私は Jayrock を使用しており、.Net Framework 2.0 で作業しています。現時点では、フレームワークのバージョンを変更できません。