读取器关闭时,读取尝试无效

本文关键字:读取 无效 | 更新日期: 2023-09-27 18:14:36

我正试图从我的c#项目中读取MySQL数据库,使用MySQL驱动程序。net从MySQL站点。

虽然我对此做了一些研究(包括这个),我仍然很困惑为什么会发生这种情况。后来我又跑了一次,我还是得到了同样的错误。(在运行这个之前,我用一些默认值填充了数据库。)以下是峰值代码。

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);
    }
}

上面的代码给了我一个异常:"reader关闭时无效的Read尝试。"

之后我修改了if条件:

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

现在0/p是-1。(数据在表中。)如果由于某种原因,结果集没有行,那么读者一开始就不应该进入If块。我的意思是,Read()方法的全部意义在于首先检查结果集中是否有行。

我实在是无计可施了……我只是不知道我哪里错了。

谢谢你的帮助!:)

读取器关闭时,读取尝试无效

我认为使用DataTable.Load会"消耗"读者,至少会把它放在最后。它甚至可能解释了封闭连接(但我只是猜测)。如果去掉这条线呢?