C # / SQL - Что не так с SqlDbType.Xml в процедурах? - PullRequest
5 голосов
/ 22 февраля 2009

Я спросил нескольких людей, почему использование xml в качестве параметра в хранимой процедуре не работает, и все ответили, что это так. Я не могу в это поверить.

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

Вот где компилятор возвращает ошибку, и я не могу использовать, потому что NVarChar ограничен 4k поет. XML был бы идеальным, так как он может быть размером в 2 гигабайта.

Как работают другие SqlDbTypes, и эта ошибка повторяется?

*

Ошибка: указанный аргумент вышел из диапазон допустимых значений. параметр имя: @xmldoc: неверный SqlDbType значение перечисления: 25.

*

Ответы [ 3 ]

14 голосов
/ 22 февраля 2009

Это работает. Вам нужно будет установить значение как SqlXml, а не строку, но это можно сделать. Представьте себе эту таблицу:

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

И спрок:

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).

0 голосов
/ 18 сентября 2015
//Create The StringWriter Object

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

//Create XmlSerializer Object for the serialization,
RequestUpdateRBCustomerExternal is the Class of which type having all the values

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

//request is of type RequestUpdateRBCustomerExternal

serializer.Serialize(stringWriter, request);

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

cmd.CommandText ="insert into SAPDataTracking values('"+DateTime.Now+"','"+xml.Value+"')";
0 голосов
/ 22 февраля 2009

Вместо использования метода Add, попробуйте использовать AddWithValue, где вам не нужно указывать тип, просто имя и значение. Разве вы не используете другое направление ввода?

...