我的基类中的c#SqlDatareader返回null连接错误

时间:2011-11-14 08:53:11

标签: c# sqldatareader

我有一个包含SqlDataReader的基类,它使用存储过程获取数据,这很有效,直到我返回数据读取器,说连接为空。

有没有人有任何想法?这是我的代码:

public SqlDataReader GetDataReader(string QueryName, SqlParameter[] Params)
{
   SqlConnection conn = new SqlConnection(this.ConnectionString);
   SqlDataReader reader;

   using (conn)
   {
      SqlCommand command = new SqlCommand(QueryName,conn);
      command.CommandType = CommandType.StoredProcedure;

      if(Params !=null)
          command.Parameters.Add(Params);

      conn.Open();

      reader = command.ExecuteReader();                
   }

   // conn.Close();

   return reader;
}

如果你注意到,我有关闭部分注释掉,这是我试图让它工作,由于某种原因,当返回datareader备份它被设置为关闭???

谢谢!

6 个答案:

答案 0 :(得分:2)

因为您的连接在返回阅读器之前已关闭并在使用块中处理。见this SO post

答案 1 :(得分:2)

使用(conn)块完成时,它会关闭数据库连接,这就是您收到该错误的原因。只需删除该行。

答案 2 :(得分:2)

您正在使用“使用”,其功能与调用conn.Close()相同。

答案 3 :(得分:2)

当您使用using (conn)时,它会自动处理conn对象

答案 4 :(得分:2)

您想要执行以下操作:

    SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection)

并且不要关闭连接。当您关闭datareader时,如果您使用上面的代码,它将为您关闭它。

答案 5 :(得分:1)

DataReader是一个连接对象。意味着从DataReader获取数据,此时需要打开下面的连接。如果您使用在断开连接模式下工作的DataSet,则情况并非如此。在返回DataReader之前,您正在关闭代码中的连接。所以DataReader无法为您提供任何数据。

更好的设计替代方案可能是从外部提供连接(依赖注入)。