我收到这个错误:
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/