Datareader在VS中没有返回结果,但Stored Procedure在Sql Server中返回多个结果集

时间:2008-12-16 00:19:42

标签: c# ado.net datareader

我无法从visual studio 2008中的datareader中检索结果。我在同一个数据库中有几个存储过程。我可以从那些不接收输入参数的值中检索值。但是,当我在带有输入参数的存储过程中使用executreReader()方法时,我得到一个空的datareader。在检查结果集合时,出现消息“IEnumerable返回无结果”。我感到困惑,因为我可以在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);

请帮助!

8 个答案:

答案 0 :(得分:5)

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

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);

答案 1 :(得分:5)

我这个愚蠢的错误。几个小时后,我意识到我正在使用的存储过程返回多个结果集,其中第一个结果集始终为空。因此缺乏结果。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

这似乎很明显,但请告诉我你正在调用.Read()方法?我讨厌提出这样一个问题,但有时这是我们在一个问题上疯狂的时候忘记的最明显的事情。

答案 4 :(得分:2)

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

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

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

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

答案 5 :(得分:1)

在sqlParam上设置parameterdirection可以解决问题。

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();

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

答案 6 :(得分:0)

您何时收到“IEnumerable返回无结果”错误?你能举例说明你是如何访问DataReader的吗?

如果在返回之前设置断点并运行

会发生什么
rdrFilterSearch.GetString(0);
在即时窗口中

答案 7 :(得分:0)

使用

reader.ExecuteNonQuery() 

快乐编码