c#中关闭读取器时,从ms访问中读取的尝试无效

本文关键字:读取 访问 无效 ms | 更新日期: 2023-09-27 18:17:31

这段代码出错了,我使用winform来执行这段代码

下面是cs代码:

        try
        {
            conn5.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = conn5;
            string query = "select * from OrderDataListTable";
            command.CommandText = query;
            OleDbDataReader reader = command.ExecuteReader();
            while (reader.Read())
               {
                    datetime = reader["DateTime"].ToString();
                    datetime = datetime.Substring(3, 2);
                    if (dateString == datetime)
                    {
                    String orderNum;    
                    orderNum = reader["OrderNo"].ToString();
                    textBox3.Text = orderNum.ToString();
                    conn5.Close();
                    getOrder();

                }
           }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error" + ex);
        }

错误提示如下:

while (reader.Read())

c#中关闭读取器时,从ms访问中读取的尝试无效

强烈怀疑您的dateString == datetime返回true时,您读取您的阅读器和您关闭连接,而您读取它。如果调试代码,就可以看到它。你当然不应该那样做。

Reader 只有在连接打开时才能工作。

我建议使用using语句来自动处置您的命令、连接和阅读器,而不是手动调用CloseDispose方法。

using(var conn5 = new OleDbConnection(connString))
using(var command = conn5.CreateCommand())
{
      // Define your CommandText
      using(var reader = command.ExecuteReader())
      {
          while (reader.Read())
          {
               // Do other stuff
          }
      }
}

通过这个命令

while (reader.Read()) { .. }

程序循环读取器获取的行。通过命令

将阅读器与连接相关联。
conn.Close();
while语句中的

只读取第一行,关闭连接导致无法读取其他行。

当你使用try catch时,最好关闭finally块上的reader和连接。 这样的

    // Declare reader before the try block
    OleDbDataReader reader = null;
    try
    {
        conn5.Open();
        OleDbCommand command = new OleDbCommand();
        command.Connection = conn5;
        string query = "select * from OrderDataListTable";
        command.CommandText = query;
        reader = command.ExecuteReader();
        while (reader.Read())
           {
                datetime = reader["DateTime"].ToString();
                datetime = datetime.Substring(3, 2);
                if (dateString == datetime)
                {
                String orderNum;    
                orderNum = reader["OrderNo"].ToString();
                textBox3.Text = orderNum.ToString();
                // conn5.Close();  -> remove this line
                getOrder();
           }
       }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error" + ex);
    }
    finally 
    {
        reader.Close();
        conn5.Close();
    }