调用存储过程不返回任何内容

Posted

技术标签:

【中文标题】调用存储过程不返回任何内容【英文标题】:call to stored procedure returns nothing 【发布时间】:2010-09-17 17:09:33 【问题描述】:

我正在像这样在 sql server 上调用一个存储过程:

SqlConnection conn = new SqlConnection();
SqlCommand cmd;
XmlDocument xmlDocument;
XmlReader xr;
XmlNode node;
SqlDataReader rdr = null;

try

    xmlDocument = new XmlDocument();
    conn.ConnectionString = "Data Source=test;Initial Catalog=teste;Integrated Security=SSPI;";
    cmd = new SqlCommand();
    cmd.Connection = conn;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "[dbo].[spSearchKeywords]";

    cmd.Parameters.Add(new SqlParameter("@VALUE", "XPT"));

    conn.Open();

    xr = cmd.ExecuteXmlReader();

    conn.Close();
    node = xmlDocument.ReadNode(xr);

它连接并执行命令,但是它什么也不返回 有数据要返回且参数正确(当我在sql中调用具有相同参数的过程时,它会返回一个结果)

这里是过程:

ALTER PROCEDURE [dbo].[spSearchKeywords]
(
    @VALUE                 NVARCHAR(50)  = NULL,
    @ACCOUNTGROUPID         NVARCHAR(50)  = NULL,
    @ShortCodeId         NVARCHAR(50)  = NULL,
    @VALUETYPE             NVARCHAR(50)  = NULL,
    @ASSEMBLY             NVARCHAR(100) = NULL,
    @ASSEMBLYCONTAINSURI NCHAR   (10)  = NULL,
    @ASSEMBLYTYPE         NVARCHAR(50)  = NULL
)
AS
BEGIN

    SET NOCOUNT ON;

    SELECT [Value]
          ,[AccountGroupId]
          ,[ShortCodeId]
          ,[ValueType]
          ,[assembly]
          ,[assemblyContainsUri]
          ,[assemblyType]
      FROM [teste].[dbo].[keywords]
     WHERE [Value]                 = ISNULL(@VALUE,                [Value])
       AND [AccountGroupId]         = ISNULL(@ACCOUNTGROUPID,        [AccountGroupId])
       AND [ShortCodeId]         = ISNULL(@SHORTCODEID,            [ShortCodeId])
       AND [ValueType]             = ISNULL(@VALUETYPE,            [ValueType])
       AND [assembly]             = ISNULL(@ASSEMBLY,            [assembly])
       AND [assemblyContainsUri] = ISNULL(@ASSEMBLYCONTAINSURI, [assemblyContainsUri])
       AND [assemblyType]         = ISNULL(@ASSEMBLYTYPE,        [assemblyType])
     FOR XML AUTO
END

【问题讨论】:

我同意 SLaks。 XML 和 SQL Server 是真正不应该“集成”的两件事。 【参考方案1】:

在实际使用 XmlReader 之前,您不能关闭连接。尝试将conn.Close() 放在node = xmlDocument.ReadNode(xr); 下方。并考虑您的一次性数据库对象的 using 语句。

【讨论】:

我也是这么想的。很惊讶在这种情况下没有例外。 @Kirk Woll:你会抛出什么异常? @Chris,我不会抛出异常。我只是假设如果 ExecuteXmlReader 的结果依赖于打开的 SQL 连接,并且该连接首先关闭,那么框架会因此而引发异常。

以上是关于调用存储过程不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

MS Management Studio 中的存储过程返回数据。使用 C# 调用时不返回任何数据

EF4 - 选定的存储过程不返回任何列

Sybase·调用存储过程并返回结果

Dapper 多参数存储过程查询不会从数据库返回任何内容

对不返回数据的存储过程使用 @NamedStoredProcedureQuery

SQL一个带参数的存储过程写法