【问题标题】:C# MySql funktion (command string in, return reader)C# MySql funktion(输入命令字符串,返回阅读器)
【发布时间】:2015-03-08 10:32:59
【问题描述】:

我编写了一个函数来执行 MySQL 语句。在这个函数中,我给出一个语句并取回 MySqlDataReader,但问题是我的函数没有关闭连接。使用程序片刻后,由于无法打开新连接而崩溃。这是我尝试打开新连接时遇到的错误:

连接错误:超时。超时时间已过 从池中获取连接。这可能已经发生 因为所有池连接都在使用中并且最大池大小是 到达。

我的代码如下所示: MySQL 类:

class mySql
{

    string cs = "server=123.123.123.123;" +
                "uid=abcabc;" +
                "pwd=123456;" +
                "database=overflow_test;";

    private MySqlConnection conn_f()     // create a Connection
    {
        MySql.Data.MySqlClient.MySqlConnection conn;

        conn = new MySql.Data.MySqlClient.MySqlConnection();

        conn.ConnectionString = cs;

        try
        {
            conn.Open();
            return conn;
        }
        catch
        {
            return null;
        }
    }
    public MySqlDataReader CMD_f(string comand) //execute SQL Command
    {
        MySql.Data.MySqlClient.MySqlCommand cmd;
        cmd = new MySql.Data.MySqlClient.MySqlCommand();
        MySqlConnection conn = conn_f();
        cmd.Connection = conn;

        cmd.CommandText = comand;
        cmd.Prepare();
        rdr = cmd.ExecuteReader();
        return rdr;
    }
}

以及我如何使用它的示例主类

class main{
mySql DB = new mySql();
public void main(){
MySqlDataReader rdr = DB.CMD_f("SELECT * FROM tbl_kategorie");
        int i = 0;
        while (rdr.Read())
        {
            string str = rdr.GetString(1);
            Console.WriteLine(str);
        }
}

有人有解决问题的想法。 真诚的问候 LFS96 (Fabian Harmsen)

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    主要问题是代码中的不平衡。 CMD_f 方法创建一个连接,但不对它负责。您应该将创建连接的方法公开,以便您可以在可以关闭它的代码中对其负责。

    这是一个较大的变化,所以首先让我们看一个较小的变化来修复代码。

    数据读取器应将数据连接公开为Connection 属性。我在文档中没有看到,所以它可能没有,但 .NET 框架中的数据读取器会。

    如果该属性被公开,那么您可以快速修复以使代码以最小的更改工作:

    MySqlDataReader rdr = DB.CMD_f("SELECT * FROM tbl_kategorie");
    int i = 0;
    while (rdr.Read())
    {
        string str = rdr.GetString(1);
        Console.WriteLine(str);
    }
    rdr.Close();
    rdr.Connection.Close();
    

    如果您将conn_f 方法公开并且不在CMD_f 方法中调用它,您可以编写更健壮的代码,即使出现错误也不会导致连接或数据读取器挂起。这是代码中一个更大的变化,但是当您有时间实现和测试它时,绝对值得付出努力。使用using 块来确保对象总是被正确放置使得代码更有弹性:

    using (MySqlConnection conn = DB.conn_f()) {
      using (MySqlDataReader rdr = DB.CMD_f(conn, "SELECT * FROM tbl_kategorie")) {
        int i = 0;
        while (rdr.Read()) {
          string str = rdr.GetString(1);
          Console.WriteLine(str);
        }
      }
    }
    

    旁注:C# 中的标识符往往是描述性的。我建议使用DB.CreateConnection 和DB.ExecuteReader 之类的名称,而不是DB.conn_f 和DB.CMD_f。

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2018-11-25
      • 2017-01-11
      • 2013-04-11
      • 2017-06-08
      • 2016-02-14
      相关资源
      最近更新 更多