SQL Server存储过程不会在VS C#中返回结果,但在SQL Server

时间:2016-08-10 14:33:54

标签: c# sql-server stored-procedures xmlreader

我编写了一个返回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

2 个答案:

答案 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