5

我在从 Visual Studio 2008 中的数据读取器中检索结果时遇到问题。我在同一个数据库中存储了多个 Procs。我能够从那些不接收输入参数的值中检索值。但是,当我在带有输入参数的存储过程上使用 executreReader() 方法时,我得到一个空的数据读取器。在检查结果集合时,会出现消息“IEnumerable returned no results”。我很困惑,因为我可以在 sql server 中执行存储的过程并返回结果集。我以前能够从 Visual Studio 中的这些存储过程中检索行,但显然它只是有一天停止工作。

我尝试使用 dataadapter 用我的结果填充数据集,并使用 executereader() 方法获取 sqldatareader,但我仍然没有得到任何结果。也不会抛出异常。我的参数都已正确命名,但我应该能够在没有参数的情况下调用这些存储的过程,并让它返回一个未过滤的结果集。我当前使用的代码如下:

string connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"]
                                     .ConnectionString;

SqlConnection connCactus = new SqlConnection(connStr);
SqlCommand cmdPopulateFilterDropDowns = new SqlCommand( "dbo.MyStoredProc",
                                                        connCactus);
SqlDataReader rdrFilterSearch = null;
cmdPopulateFilterDropDowns.CommandType = CommandType.StoredProcedure;

connCactus.Open();
rdrFilterSearch = cmdPopulateFilterDropDowns
                      .ExecuteReader(CommandBehavior.CloseConnection);

return (rdrFilterSearch);

请帮忙!

4

8 回答 8

5

我犯了愚蠢的错误。经过几个小时的努力,我意识到我正在使用的存储过程返回多个结果集,其中第一个结果集总是空的。因此缺乏结果。

于 2008-12-23T20:44:55.517 回答
5

您是否曾经将参数添加到 SqlCommand 的 Parameter 集合中?你提到那些不工作的是那些接受输入参数的,但在你的代码中你没有这样的东西:

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);
于 2008-12-16T01:27:17.313 回答
2

我有一个类似但不完全相同的问题让我发疯,所以我会把它扔进去,以防它帮助别人。

我可以使用 Management Studio 在 SQL Server 上运行 SQL,或使用相同的 SQL 调用存储过程,然后返回填充的结果集。但是,当我从我的 ASP.Net Web 应用程序项目的 Visual Studio 代码中使用相同的 SQL 内联或调用包含它的存储过程时,我得到了一个空的 DataReader。

相同的 SQL 如何在 Management Studio 中返回结果集,但在 Visual Studio 中返回一个空的 DataReader?答案是我在这两个工具中以具有不同权限的不同用户身份运行。在 Management Studio 中,我作为具有大量权限的特定 SQL 角色的开发人员运行。但是在 Visual Studio 中,我作为一个服务帐户运行,该帐户没有被授予对我正在查询的表的权限。

实际上,我的问题要复杂得多。一切都很好,直到我更改了 SQL/sproc 并将表 JOIN 添加到另一个表中,并且该表缺少必要的服务帐户权限。但原理是一样的:检查进行数据库调用的用户的所有权限。

于 2010-04-28T15:36:31.397 回答
2

针对您认为正在执行命令的服务器运行 SQL 服务器跟踪。实际发送到服务器的是什么?我想你会在那里找到确凿的线索。

BFree 有一个好点,检查 AddWtihValue() 与 Add()。还要确保如果您显式实例化 SqlParameter 对象,可能会出现与 .Add() 相同的问题。请注意,当您将 (int)0 的值传递给它时,Parameters.Add() 存在设计缺陷——它们被视为枚举而不是值......

于 2008-12-16T01:32:31.450 回答
2

这似乎很明显,但请告诉我您正在调用 .Read() 方法?我讨厌提出这样的问题,但有时当我们为某个问题发疯时,我们会忘记最明显的事情。

于 2008-12-16T01:34:54.317 回答
1

在 sqlParam 上设置参数方向应该可以解决问题。

mySqlParam.Direction = ParameterDirection.ReturnValue;

如果您希望返回多个值,只需添加参数并设置它的方向:

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@ID";
    mySqlParam.SqlDbType = SqlDbType.int;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Name";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;


    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Address";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

mySqlParam.ParameterName不必与存储过程中的名称完全相同。

然后您可以读取这样的值(不完整的示例):

int.Parse(dataReader["ID"]);
dataReader["name"].ToString();
dataReader["address"].ToString();

in 的值dataReader[""].ToString();必须与存储过程中的列名匹配。

于 2009-12-07T12:11:38.733 回答
0

利用

reader.ExecuteNonQuery() 

快乐编码

于 2010-11-03T13:05:44.617 回答
0

什么时候出现“IEnumerable 没有返回结果”错误?您能否举例说明您如何访问 DataReader?

如果在返回之前设置断点并运行会发生什么

rdrFilterSearch.GetString(0);

在即时窗口中?

于 2008-12-16T00:29:27.990 回答