我编写了一个返回XML的存储过程。当我在SQL Server管理工作室中运行存储过程时,它会返回xml,但是,当我在C#代码中运行它时,不会返回xml。我的代码如下所示:
using (SqlConnection conn = new SqlConnection(connStr)) {
using (SqlCommand cmnd = new SqlCommand("dbo.spMyStoredProcXML", conn)) {
cmnd.CommandType = CommandType.StoredProcedure;
cmnd.Parameters.Add("@Param1", SqlDbType.VarChar, 50);
cmnd.Parameters["@Param1"].Value = "Some value";
//more parameters...
conn.Open();
XmlReader xrdr = cmnd.ExecuteXmlReader();
//do stuff...
}
}
我已经检查了我创建的用户的权限,它们看起来像这样: 在服务器级别,在“登录属性”对话框的“用户映射”下,我已将用户映射到正确的数据库,并“检查”了public,db_datareader,db_datawriter,然后甚至将它们添加到db_owner角色。
在数据库级别,我还进入了“数据库用户”对话框的“Securables”部分,并明确地授予用户Grant和With Grant权限以执行相关存储过程。我还明确为用户选择了“授予”权限,以删除,插入,选择和更新数据库中的所有表。
仍然,当“XmlReader xrdr = cmnd.ExecuteXmlReader();”时行运行时,xrdr变量为空。没有报告错误。有人可以提出我需要检查的其他建议吗?
提前感谢您提供的任何帮助。
以下是存储过程的简化版本(在SQL Server Management Studio中完美运行):
CREATE PROCEDURE [dbo].[spGetXML]
(@param1 varchar(50), @param2 varchar(1))
AS BEGIN
SET NOCOUNT ON;
with xmlnamespaces ('http://schemas.xmlsoap.org/soap/encoding/' as SOAP_ENC)
select
d.Col1,
d.Col2,
from MyTable d
where d.Col1 = @param1 and
d.Col2 = @param2
FOR XML PATH('ObjectName'), root('DOCUMENT'), type
END
答案 0 :(得分:-1)
我认为你的StoredProcedure已经有了必要的字段。 所以,试试这个:
using (SqlConnection conn = new SqlConnection(connStr)) {
conn.Open();
using (SqlCommand cmnd = new SqlCommand("dbo.spMyStoredProcXML", conn)) {
cmnd.CommandType = CommandType.StoredProcedure;
cmnd.Parameters.AddWithValue("@Param1", "Some value";)
//more parameters...
XmlReader xrdr = cmnd.ExecuteXmlReader();
//do stuff...
}
}
答案 1 :(得分:-1)
也许试试这个:
在您的程序中,确保您的参数被定义为输出参数:
CREATE PROCEDURE [dbo].[MyStoredProcedure]
@Param1 xml OUTPUT
SET @Param1 = (SELECT XML from TABLE)
然后在你的C#代码中:
cm.Parameters.Add("@Param1", SqlDbType.Xml).Direction = ParameterDirection.Output;
Param1 = Convert.ToString(cm.Parameters["@Param1"].Value);
显然,将数据类型调整为适合的值。另外,如果你在这个过程中做了很多工作,我个人会使用ExecuteNonQuery而不是使用XMLReader