C#/SQL - 程序中的 SqlDbType.Xml 有啥问题?

Posted

技术标签:

【中文标题】C#/SQL - 程序中的 SqlDbType.Xml 有啥问题?【英文标题】:C#/SQL - What's wrong with SqlDbType.Xml in procedures?C#/SQL - 程序中的 SqlDbType.Xml 有什么问题? 【发布时间】:2009-02-22 13:26:45 【问题描述】:

我问过很少人为什么在存储过程中使用 xml 作为参数不起作用,每个人都说,就是这样。我不敢相信。

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

这就是编译器返回错误的地方,我不能使用 NVarChar 因为它仅限于 4k 唱。 XML 将是完美的,因为它可以是 2gigs 大。

为什么其他 SqlDbTypes 运行良好,而这个返回错误?

*

错误:指定的参数超出 有效值的范围。范围 名称:@xmldoc:无效的 SqlDbType 枚举值:25。

*

【问题讨论】:

如果有错误,最好将错误附加到帖子中。 我假设您至少使用 SQL2005 并且您的列被声明为 XML 数据类型? 如果您使用 SQL Server 2005 及更高版本,则对 NVARCHAR 字符串的大小有更大的限制。请参阅 MAX 关键字 - msdn.microsoft.com/en-us/library/ms186939.aspx - MAX 表示 NVARCHAR 的最大长度为 1,073,741,822 你的 XML 参数是什么样的,你是如何构造它的? 这篇文章可能感兴趣 - dotnet.sys-con.com/node/406637 - 所有代码都可以通过超链接获得 【参考方案1】:

确实有效。您必须将值设置为 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) 中工作。

【讨论】:

你的例子工作得很好,尽管当我在我的 CF 3.5 应用程序上尝试它时,它一直说 SqlDbType.Xml -“指定的参数超出了有效值的范围。参数名称: @xmldoc:SqlDbType 枚举值无效:25" 我没有意识到它是 Compact Framework。在更改练习之前,我必须查看 CF 的规则。它是完整 .NET Framework 中功能的子集。【参考方案2】:

不要使用 Add 方法,而是尝试使用 AddWithValue,您不需要指定类型,只需指定名称和值。除非您使用不同的方向输入?

【讨论】:

我试过了,但它给了我一个线索。在调试它时我注意到它认为值是 NVarChar ,所以我的 xml 参数是错误的格式,我使用:data.Document.ToString() ,其中数据是 XDocument,也许它需要带有代码页信息的文档? 尝试提供实际对象本身,而不是使用 .ToString() 方法,因为 AddWithValue 需要一个字符串参数但一个对象值。我原以为然后提供您的 XDocument 它会采用格式,或者如您所说提供代码页。【参考方案3】: //创建StringWriter对象 var stringWriter = new System.IO.StringWriter(); //为序列化创建XmlSerializer对象, RequestUpdateRBCustomerExternal 是具有所有值的类型的类 var serializer = new XmlSerializer(typeof(RequestUpdateRBCustomerExternal)); //请求的类型为 RequestUpdateRBCustomerExternal serializer.Serialize(stringWriter, request); SqlXml xml = new SqlXml(new XmlTextReader(stringWriter.ToString(), XmlNodeType.Document, null)); cmd.CommandText ="插入 SAPDataTracking 值('"+DateTime.Now+"','"+xml.Value+"')";

【讨论】:

IMO 您应该提供有关您的答案的详细信息

以上是关于C#/SQL - 程序中的 SqlDbType.Xml 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助将 c-strings 从嵌入式 SQL fetch 复制到单独结构中的另一个 c-string

从SQL Server代理(作业)运行C#控制台应用程序?

Java中的Oracle Sql语句

FORTRAN语言程序中,语句INTEGER(1) :: vendor_code(550)是啥意思?

MySQL SQL中的安全问题

[转]什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查