c# - 存储过程和 XML

标签 c# asp.net sql-server xml stored-procedures

我收到这个错误:

The error description is 'Only one top level element is allowed in an XML document.'.
Could not find prepared statement with handle 0.
The XML parse error 0xc00ce555 occurred on line number 1, near the XML text "<value1>34</value1><value1>33</value1><value1>32</value1>".
The statement has been terminated. 

这是存储过程调用:

 public bool HideFromList(string commentList, bool state)
{
//commentList =<values><value1>34</value1><value1>33</value1><value1>32/value1></values>
  using (SqlConnection cn = new SqlConnection(this.ConnectionString))
 {
       SqlCommand cmd = new SqlCommand("VisibleFromList", cn);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.Add("@XMLDoc", SqlDbType.Xml).Value = commentList;
       cmd.Parameters.Add("@state", SqlDbType.Int).Value = state;
       cn.Open();
       int ret =  cmd.ExecuteNonQuery();

       return (ret == 1);
 }          

这是我的存储过程:

ALTER PROCEDURE dbo.VisibleFromList
(
    @XMLDoc   xml,
    @state     BIT
)

AS
BEGIN


DECLARE @docHandle int
EXEC sp_xml_preparedocument @docHandle OUTPUT, @XMLDoc 


UPDATE tbh_Comments
SET Visible = @state WHERE 
CommentID IN (SELECT * FROM OPENXML(@docHandle, '/values/value1', 2) WITH (value1 INT '.'))


END

但是如果我用嵌入的输入字符串修改 SP 它确实有效:

ALTER PROCEDURE dbo.VisibleFromList
(
    @XMLDoc   xml,
    @state     BIT
)

AS
BEGIN


DECLARE @docHandle int
EXEC sp_xml_preparedocument @docHandle OUTPUT, 
'<values>
 <value1>33</value1>
<value1>34</value1>  
</values>'

UPDATE tbh_Comments
SET Visible = @state WHERE 
CommentID IN (SELECT * FROM OPENXML(@docHandle, '/values/value1', 2) WITH (value1 INT '.'))


END

如何使它与输入参数一起工作?

最佳答案

您确定您的 commentList 与您描述的一样吗?

//commentList =<values><value1>34</value1><value1>33</value1><value1>32/value1></values>

如果您的列表确实与那个相似,它应该可以工作。

根据您的错误,出现了<values>元素可能不存在:

near the XML text "<value1>34</value1><value1>33</value1><value1>32</value1>".

关于c# - 存储过程和 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088202/

相关文章:

c# - 在 ASP.NET/DotNetNuke 中公开 JSON 服务的最简单方法

c# - 具有基于类型的数据模板选择和绑定(bind)的 Contentpresenter

asp.net - 为什么我的查询这么慢?

sql - 将动态生成的数据透视表获取到临时表中

sql-server - 为什么将列从 varchar(50) 更改为 int 需要更多空间

c# - 如何从我的命令行捕获标准输出?

c# - 我什么时候应该使用 AutoMapper,什么时候不应该

asp.net - 使用 wget 下载分块资源?

c# - ASP.NET 身份和 ASP.NET 成员身份提供程序 "Mashup"

sql - 根据周将日期部分转入上一年