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

本文关键字:返回 Server SQL 但在 结果 存储过程 VS | 更新日期: 2023-09-27 18:01:39

我编写了一个返回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 = cmd . executexmlreader();"行运行时,xrdr变量为空。无错误报告。谁能告诉我还需要检查什么吗?

事先感谢您提供的任何帮助。

下面是一个简化版本的存储过程(在SQL Server Management Studio中完美地工作):

CREATE PROCEDURE [dbo].[spGetXML]
(@param1 varchar(50), @param2 varchar(1))

开始

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
结束

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

我想您的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...
     }
  }

不妨试试:

在你的过程中,确保你的参数被定义为一个输出参数:

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