获取异常:读取器关闭时读取的次数无效

时间:2011-11-12 04:39:04

标签: c# mysql database-connection sqldatareader

我正在尝试使用MySQL网站上的.net的MySQL驱动程序从我的C#项目中读取MySQL数据库。

虽然我对此进行了一些研究(包括this),但我仍然为此感到沮丧。我后来跑了一个尖峰,我仍然得到同样的错误。 (在运行之前,我使用一些默认值填充数据库。)这是toto中的尖峰代码。

class Program {
    static void Main (string[] args) {
        Console.WriteLine (GetUserAge ("john")); // o/p's -1
    }

    static int GetUserAge (string username) {
        string sql = "select age from users where name=@username";

        int val = -1;
        try {
            using (MySqlConnection cnn = GetConnectionForReading ()) {
                cnn.Open ();
                MySqlCommand myCommand = new MySqlCommand (sql, cnn);
                myCommand.Parameters.AddWithValue ("@username", username);

                using (MySqlDataReader reader = myCommand.ExecuteReader ()) {
                    DataTable dt = new DataTable ();
                    dt.Load (reader);

                    if (reader.Read ()) {
                        val = reader.GetInt32 (0);
                    }
                }
            }
        } catch (Exception ex) {
            Console.WriteLine (ex.Message);
        } finally {
        }

        return val;
    }

    private static MySqlConnection GetConnectionForReading () {
        string conStr = "Data Source=localhost;Database=MyTestDB;User ID=testuser;Password=password";
        return new MySqlConnection (conStr);
    }
}

上面的代码给了我一个例外:“读取器关闭时无效的读取尝试。”

后来我像这样修改了if条件:

if (reader.HasRows && reader.Read ()) {
    val = reader.GetInt32 (0);
}

现在o / p是-1。 (表中的数据在那里。)如果由于某种原因结果集的行为零,那么读者不应该首先进入if-block。我的意思是,Read()方法的重点是检查结果集中是否有任何行。

我的智慧在这里结束......只是无法弄清楚我哪里出错了。

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:3)

我认为使用DataTable.Load将“消耗”读者,并且至少将其置于最后。它甚至可以解释关闭的连接(但我只是在这里猜测)。如果删除该行怎么办?我觉得这里没有任何意义。