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