我现在在我的项目中碰壁。 我有一个带有一些列表框的表单,并添加了按钮。当我单击添加按钮时,我得到一个带有文本框,确定和取消按钮的小对话框。该应用已连接到MySQL数据库。因此,每当文本更改时,程序都会检查数据库中是否存在该名称,请禁用“确定”按钮,如果该名称存在,则文本框将变为红色,否则它将恢复为正常状态。当我正在编写且名称不存在时,它可以正常工作,当它出现时,它会像应有的那样变成红色。这就是问题所在。变成红色后,即使输入了有效的名称,它也不会恢复正常。
这是代码:
private void DialogTxb_TextChanged(object sender, EventArgs e)
{
//ConnexionData class where i do all the SQL manipulation
MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text);
while (selection.Read())
{
if (selection.HasRows)
{
DialogOk.Enabled = false;
toolTip1.Show("La section existe", TooltibLb);
DialogTxb.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffaaaa");
}
else
{
toolTip1.Hide(TooltibLb);
DialogTxb.BackColor = Color.White;
DialogOk.Enabled = true;
}
}
ConexionData.ConexionClose();//Method to close connection
}
我想我知道问题出在哪里,但不知道为什么会发生以及如何解决。如果我只是退出表单并尝试执行其他操作,例如从列表框中选择另一个元素,这将触发一些数据库交互,则程序关闭并且Visual Studio为我提供了有关错误的信息:“连接已打开”。我试图关闭代码的其他时间,在互联网上寻找一些解决方案,尝试使用MysqlConection.ClearAllPools()
,并且仍然是同一问题。
Connexion在应用程序的其他部分正确打开和关闭。
感谢您的关注。
修改
以下是ConexionData中的方法
class ConnexionData
{
private static MySqlConnection Connexion;
public static MySqlCommand Command;
//Many other methods
//.......
public static void ConnexionClose()
{
Connexion.Close();
}
public static MySqlDataReader CheckSectionName(string name)
{
Connexion.Open();
string checkSectionName = ("Select sectionName from section where sectionName = '" + name + "'");
Command.CommandText = checkSectionName;
Reader = Command.ExecuteReader();
return Reader;
}
}
我在程序的许多部分中使用了Connexion.Close()。我有2个数据网格视图,以及一些从数据库加载数据的列表框。我打开和关闭那些DGV并在列表框中更改值,所有这些工作正常。然后,我尝试用我的小型表单在这些表上插入新值,对其进行测试并关闭(实际上我什么也没插入,我只是将其关闭,并且close事件中有一个ConexionData.Close()
),在这里出现了问题所在连接开始。
已解决
我终于解决了这个问题。我将Private MysqlConection
设为公开,并在关闭对话框后直接关闭了该属性。
答案 0 :(得分:3)
如果selection.Read()
返回true
,则表示您至少有1
条记录。看来您在找
private void DialogTxb_TextChanged(object sender, EventArgs e) {
try {
//TODO: check ConexionData.CheckSectionName (re-)creates connection if required
using (MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text)) {
if (selection.Read()) {
// Name exists (we've read it)
DialogOk.Enabled = false;
toolTip1.Show("La section existe", TooltibLb);
DialogTxb.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffaaaa");
}
else {
// Name doesn't exist: the cursor is empty (so we've failed to read it)
toolTip1.Hide(TooltibLb);
DialogTxb.BackColor = Color.White;
DialogOk.Enabled = true;
}
}
}
finally {
// finally: rain or shine the connection should be closed
ConexionData.ConexionClose(); // Method to close connection
}
}
答案 1 :(得分:0)
如果连接没有关闭,那么您可以在执行方法“ CheckSectionName()”之前尝试调用close()连接或sqldatareader。 FYR下面是一些示例,如果有帮助,请告诉我。
方法1:
System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
if(sqlConn.State!= System.Data.ConnectionState.Closed)
{
sqlConn.Close();
}
System.Data.SqlClient.SqlDataReader SqlReader= new System.Data.SqlClient.SqlDataReader();
if(!SqlReader.IsClosed)
{
SqlReader.Close();
}
MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text);
方法2:我们可以使用“ using”子句
using (MySqlDataReader selection = ConexionData.CheckSectionName(DialogTxb.Text))
方法3: 将close()和dispose()添加到finally块中。