在Visual Studio中,Datareader没有返回结果,但是在Sql Server中,存储过程返回了多个结果集。

5
我在Visual Studio 2008中从数据读取器中检索结果时遇到了问题。我有几个存储过程在同一个数据库中。我能够从那些不接收输入参数的存储过程中检索值。然而,当我在带有输入参数的存储过程上使用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);

Please Help!


1
此外,如果您发布 SP(存储过程)的话,可能会有所帮助? - JamesSugrue
如果我放置一个断点并将鼠标悬停在数据读取器上,扩展结果视图,则会显示“枚举未产生任何结果”。 - undefined
是的,权限没问题。我在整个 Web 应用程序中使用相同的连接字符串。一些存储过程返回结果,而其他一些则没有。我可以从所有不接受输入参数的存储过程中检索结果,但无法从那些需要输入参数的存储过程中检索结果。 - undefined
我已经设置了在数据库中存在的值的参数,但是没有得到任何值。我也尝试过不发送任何参数,因为我应该能够提交没有筛选器(参数)并检索未经过滤的结果集。 - undefined
你有解决方案吗?我也遇到了同样的问题。有人能帮忙吗? - Chintan
显示剩余3条评论
8个回答

5

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


有时候,愚蠢的答案是最好的。我也遇到了类似的问题。 - Xynariz

5

您是否向SqlCommand的参数集合中添加了参数?您提到那些不起作用的是需要输入参数的,但是在您的代码中并没有类似于以下内容:

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);

2

我曾经遇到过类似的问题,虽然不完全相同,但这个问题让我非常苦恼。因此,我想分享一下我的经验,希望能帮助到其他人。

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

为什么相同的 SQL 在 Management Studio 中返回一个结果集,在 Visual Studio 中却返回一个空的 DataReader?答案是我在两个工具中以不同的用户身份和权限运行。 在 Management Studio 中,我作为开发人员在特定的 SQL 角色中运行,拥有很多权限。但是在 Visual Studio 中,我作为一个服务账户运行,而这个服务账户没有被授权查询我正在查询的表。

实际上,我的问题更加复杂。在我修改 SQL/sproc 并将一个表 JOIN 到另一个表之后,一切都很顺利,但那个表缺少必要的服务账户权限。但是原则是相同的:检查所有调用数据库的用户的权限。


2

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

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


2

这可能看起来很明显,但请问您是否正在调用 .Read() 方法?我不想提出这样的问题,但有时我们在为一个问题疯狂而苦恼时,会忘记最显而易见的事情。


以上代码返回一个读取器,我在调用代码中使用 .read() 方法。 - undefined

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(); 中的值必须与存储过程中的列名匹配。


0
你什么时候会遇到"IEnumerable returned no results"错误?你能展示一下你如何访问DataReader的例子吗?
如果在return之前设置一个断点并运行会发生什么?
rdrFilterSearch.GetString(0);

在即时窗口中?


0

使用

reader.ExecuteNonQuery() 

编程愉快


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接