6

ストアドプロシージャのパラメータとしてxmlを使用できない理由を数人に尋ねたところ、誰もがそう言っていました。信じられない。

command.Parameters.Add("@xmldoc", SqlDbType.Xml);

コンパイラがエラーを返し、4kの歌に制限されているため、NVarCharを使用できません。XMLは2ギガの大きさになる可能性があるため、完璧です。

他のSqlDbTypeがうまく機能し、これがエラーを再実行するのはなぜですか?

*

エラー:指定された引数が有効な値の範囲外でした。パラメータ名:@xmldoc:無効なSqlDbType列挙値:25。

*

4

3 に答える 3

15

それは機能します。値を文字列ではなく SqlXml として設定する必要がありますが、それは可能です。次の表を想像してください。

CREATE TABLE XmlTest
(
    [XmlTestId] [int]   identity(1,1) primary key,
    [XmlText]   [xml]   NOT NULL
)

そしてsproc:

CREATE PROCEDURE XmlTest_Insert
(
    @XmlText    xml
)
AS

INSERT INTO XmlTest (XmlText)
VALUES (@XmlText)

次のようなコンソール アプリケーションを想像してみてください。

using System.Data.SqlClient;
using System.Data;
using System.Data.SqlTypes;
using System.Xml;

namespace TestConsole
{
    class Program
    {

        static void Main(string[] args)
        {
            string xmlDoc = "<root><el1>Nothing</el1></root>";
            string connString = "server=(local);database=IntroDB;UID=sa;PWD=pwd";
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand("XmlTest_Insert", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param = new SqlParameter("@XmlText", SqlDbType.Xml);
            param.Value = new SqlXml(new XmlTextReader(xmlDoc
                           , XmlNodeType.Document, null));
            cmd.Parameters.Add(param);

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Dispose();
        }
    }
}

ビンゴ!

これは Visual Studio 2008 (.NET 3.5) で行われましたが、Visual Studio 2005 (2.0 Framework) でも機能するはずです。

于 2009-02-22T14:50:13.690 に答える
0

Addメソッドを使用する代わりに、名前と値だけでタイプを指定する必要がないAddWithValueを使用してみてください。入力に別の方向を使用していない限り?

于 2009-02-22T13:49:39.220 に答える
-2
//StringWriter オブジェクトを作成する

var stringWriter = new System.IO.StringWriter();

//シリアル化用の XmlSerializer オブジェクトを作成し、
RequestUpdateRBCustomerExternal は、すべての値を持つ型のクラスです

var serializer = new XmlSerializer(typeof(RequestUpdateRBCustomerExternal));

//リクエストのタイプは RequestUpdateRBCustomerExternal

serializer.Serialize(stringWriter、リクエスト);

SqlXml xml = new SqlXml(new XmlTextReader(stringWriter.ToString(), XmlNodeType.Document, null));

cmd.CommandText ="insert into SAPDataTracking values('"+DateTime.Now+"','"+xml.Value+"')";
于 2015-09-18T07:14:13.713 に答える