2

SQLParameterを使用してXMLタイプの列に格納しようとすると、SQLParameterに問題が発生します。SqlDbType.Xmlのパラメーターを作成しています。空白のみのXML要素は閉じた要素に変換されているようです。

これはと同じ動作です

SELECT CAST('<Cust><Fname>Andrew</Fname><Lname> </Lname></Cust>' as XML) 
VS 
SELECT CONVERT(xml, '<Cust><Fname>Andrew</Fname><Lname> </Lname></Cust>', 1)

これがSQLParameter内のデフォルトの動作であることに驚いています。SqlDbType.XmlのSQLParameterに空白を気にする方法はありますか?暗闇の中でのショットとして、Precisionを1に設定しようとしましたが、それは役に立ちませんでした...

以下のコードは、データベースでこれで終わります

<Cust><Fname>Andrew</Fname><Lname /></Cust>

ご覧のとおり、空白のXML要素が削除されています

// CREATE TABLE T(c1 int primary key, c2 xml)
static void Main(string[] args) {

using (var Connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;"))
{
    Connection.Open();

    using (var Command = Connection.CreateCommand())
    {
      Command.CommandText = "INSERT INTO T VALUES (1, @s)";

      var XmlParameter = Command.Parameters.Add("s", System.Data.SqlDbType.Xml);
      XmlParameter.Value = "<Cust><Fname>Andrew</Fname><Lname>  </Lname></Cust>";

      Command.ExecuteNonQuery();
    }

    Connection.Close();
}

パラメータをバイナリとして解析し、挿入/更新コマンドの一部として変換しない、それを解決する方法を知っている人はいますか?

Command.CommandText = "INSERT INTO T VALUES (1, CONVERT(xml, @s, 1))";

ヘルプやフィードバックをいただければ幸いです。

4

1 に答える 1

1

外部ソースからXMLを受信して​​いて、それが要素で始まっているだけの場合は、文字列の前に接頭辞を付けることができます

<?xml version="1.0"?>
<!DOCTYPE Cust [
<!ATTLIST Cust xml:space (preserve) #FIXED 'preserve'>
]>

これにより、ドキュメント全体(Custルートノードが下にある)で空白が保持されます。特定のフィールドのみに関心がある場合は、ATTLISTがCustと言う代わりに、空白を保持する要素ごとに新しいATTLISTを追加します。

<!ATTLIST Fname xml:space (preserve) #FIXED 'preserve'>
<!ATTLIST Lname xml:space (preserve) #FIXED 'preserve'>

繰り返しになりますが、SQLサーバーを試したことはありませんが(アクセスできません)、IEとChromeのXMLプロセッサは、予想どおりxml:space="preserve"をドキュメントに追加します。上記はあなたが探していた振る舞いをあなたに与えました。このアプローチでは、XMLを深く操作しなくても、ドキュメントの先頭にいくつかの処理ディレクティブを追加するだけで済みます。

于 2012-08-21T10:33:08.230 に答える