C#Mysql连接必须有效并且打开

首先:我在没有使用oop的情况下运行了代码。 我在同一个类中声明了所有变量,并在将查询传递给db之前和之后打开/关闭了连接。 那很有效! 现在有了一些新的经验,我试图将我的代码分成不同的类。 现在它不再工作了。

它告诉我“连接必须有效且开放”。 足够的文字,这是我目前的代码:


Services.cs

public static MySqlConnection conn // Returns the connection itself { get { MySqlConnection conn = new MySqlConnection(Services.ServerConnection); return conn; } } public static string ServerConnection // Returns the connectin-string { get { return String.Format("Server={0};Port=XXXX;Database=xxx;Uid=xxx;password=xxXxxXxXxxXxxXX;", key); } } public static void DB_Select(string s, params List[] lists) { try { MySqlCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string command = s; cmd.CommandText = command; MySqlDataReader sqlreader = cmd.ExecuteReader(); while (sqlreader.Read()) { if (sqlreader[0].ToString().Length > 0) { for (int i = 0; i < lists.Count(); i++) { lists[i].Add(sqlreader[i].ToString()); } } else { foreach (List save in lists) { save.Add("/"); } } } sqlreader.Close(); } catch (Exception ex) { MessageBox.Show("Error while selecting data from database!\nDetails: " + ex); } } 

LoginForm.cs

 private void checkUser(string username, string password) { using (Services.conn) { Services.conn.Open(); Services.DB_Select("..a short select statement.."); Services.conn.Close(); } 

我想这就是我们所需要的。 我缩短了我的代码以专注于问题。

我创建了Services.cs以获得从所有表单访问数据库的全局方式,而无需复制和粘贴连接信息。 现在,当我到达我的LoginForm.cs时,它会抛出错误“连接必须有效并打开” 。 我已经调试了我的代码。 它一直都是关闭的。 即使通过conn.Open()它也会保持关闭状态。 为什么?

另一个尝试:我也尝试在开头和结尾的Services.DB_Select(..)中放置conn.Open()conn.Close() 。 这里也是错误的。

我不得不说:代码之前有效,我使用了相同的连接字符串。 所以字符串本身肯定是有效的。

我感谢这里给予的任何帮助!

问题是您不存储从工厂属性返回的连接。 但是不要像使用方法那样使用属性。 而是以这种方式使用它:

 using (var con = Services.conn) { Services.conn.Open(); Services.DB_Select("..a short select statement..", con )); //Services.conn.Close(); unnecessary with using } 

因此,在从属性返回的使用中使用相同的连接(或者在使用中更好地创建)并将其传递给使用它的方法。 顺便说一句,使用属性作为工厂方法并不是最佳实践。

在我看来,创建使用它的连接要好得多,最好的位置在using语句中。 并将con属性扔到垃圾桶,它是毫无意义的,并且是恶意错误的来源。

 public static void DB_Select(string s, params List[] lists) { try { using(var conn = new MySqlConnection(Services.ServerConnection)) { conn.Open(); MySqlCommand cmd = conn.CreateCommand(); cmd.CommandText = s; using( var sqlreader = cmd.ExecuteReader()) while (sqlreader.Read()) { if (sqlreader[0].ToString().Length > 0) { for (int i = 0; i < lists.Count(); i++) { lists[i].Add(sqlreader[i].ToString()); } } else { foreach (List save in lists) { save.Add("/"); } } } // unnecessary to close the connection } // or the reader with the using-stetement } catch (Exception ex) { MessageBox.Show("Error while selecting data from database!\nDetails: " + ex); } } 

尝试按如下方式重新构建Services类

  public static MySqlConnection conn // Returns the connection itself { get { MySqlConnection conn = new MySqlConnection(Services.ServerConnection); return conn; } } private static string ServerConnection // Returns the connectin-string - PRIVATE [Improved security] { get { return String.Format("Server={0};Port=XXXX;Database=xxx;Uid=xxx;password=xxXxxXxXxxXxxXX;", key); } } // Rather than executing result here, return the result to LoginForm - Future improvement public static void DB_Select(MySqlConnection conn ,string s, params List[] lists) { try { MySqlCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string command = s; cmd.CommandText = command; MySqlDataReader sqlreader = cmd.ExecuteReader(); while (sqlreader.Read()) { if (sqlreader[0].ToString().Length > 0) { for (int i = 0; i < lists.Count(); i++) { lists[i].Add(sqlreader[i].ToString()); } } else { foreach (List save in lists) { save.Add("/"); } } } sqlreader.Close(); } catch (Exception ex) { MessageBox.Show("Error while selecting data from database!\nDetails: " + ex); } } 

在LoginForm.cs中使用返回连接并将其存储在那里。 当您需要执行查询时,请使用

  MySqlConnection conn=Services.conn(); // Get a new connection Services.DB_Select(conn,"..a short select statement.."); // Executing requirement Services.conn.Close(); 

附加 – 我建议您需要将MySqlDataReader返回到LoginForm并在那里处理结果

 private MySqlConnection _conn; public MySqlConnection conn // Returns the connection itself { get { if(_conn == null) _conn = new MySqlConnection(Services.ServerConnection); return _conn; } }