Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SqlConnection打开DataReader错误_C#_.net_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

C# 使用SqlConnection打开DataReader错误

C# 使用SqlConnection打开DataReader错误,c#,.net,sql,sql-server,sql-server-2005,C#,.net,Sql,Sql Server,Sql Server 2005,在我的项目中,我有一个从Sql2005服务器检索数据的函数 像这样, SqlConnection sqlCnn = new SqlConnection(""); SqlCommand sqlCmd = new SqlCommand("Select user_id from users"); SqlDataReader sqlReader = null; sqlCnn.Open(); sqlCmd.Connection = sqlCnn; sqlReader = sqlCmd.ExecuteRe

在我的项目中,我有一个从Sql2005服务器检索数据的函数 像这样,

SqlConnection sqlCnn = new SqlConnection("");
SqlCommand sqlCmd = new SqlCommand("Select user_id from users");
SqlDataReader sqlReader = null;

sqlCnn.Open();
sqlCmd.Connection = sqlCnn;
sqlReader = sqlCmd.ExecuteReader();

if (sqlReader.HasRows)
{
    while (sqlReader.Read())
    {
        if(user_id == 1)
        {
            SqlCommand sqlCmd2 = new SqlCommand("Select mobile from tbl");
            sqlCmd2.Connection = sqlCnn;
            sqlCmd2.ExecuteReader();
        }
    }
}
我在执行sqlcmd2时遇到以下错误

已经有一个开放的DataReader 与此命令关联,该命令 必须先关闭

我不想在那里创建新的sqlconnection。有办法解决吗
此问题?

要为每个连接打开两个读卡器,需要启用MARS(多个活动结果集)。 您可以通过连接字符串执行此操作:

 Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; MultipleActiveResultSets=true;
但是,不建议采用这种方法。
我相信您可以通过一次查询检索到所需的数据

如果需要,您需要解释您需要检索的内容,并对单个查询提供建议。
我假设您显示的代码只是一个示例,而不是一个真实的示例,因为它没有多大意义


查看“MARS是否都是好消息,还是有任何负面影响?”部分

如果您不能创建第二个SQL连接,则可以启用(多个活动结果集)


为什么不需要第二个连接?

解决此问题的最佳方法是在数据库中将两个表连接在一起。这至少会使性能提高一个数量级,特别是在适当的列上有索引的情况下

数据结构不参与其中;这完全取决于你对结果的排序以及你如何阅读它们。如果操作正确,您可以将其读入任何可以想象的数据结构中

但如果这不是一个选项,请确保至少使用Sql Server 2005,并将
MultipleActiveResultSets=true
添加到连接字符串中


而且,当您这样做时,您现有的代码被破坏,最终可能导致数据库不可用,因为在发生异常的情况下,您不能保证关闭连接。要解决此问题,请使用块在
内创建SqlConnection对象。

在.NET4中,不需要检查hasrows条件。Reader.Read()方法根据表内容返回true/false。刚和空桌子核对过。成功了

由于数据结构的原因,我们无法通过单个查询检索所有数据。这就是为什么我们必须使用另一个命令的原因,使用该命令有问题吗?谢谢,您可以在这里了解缺点:什么样的数据结构会使您无法一次性执行?你想还什么?用户表和tbl之间的关系是什么?为什么要检查用户_id==1?一次完成的任务越多,开销就越小。这只是示例代码,我们必须在执行第一个命令后进行检查和计算,然后根据该结果执行另一个命令。谢谢