我的代码:
private void button2_Click(object sender, EventArgs e)
{
sql.Open();
string id = textBox1.Text;
string cadena = "DELETE FROM contacts WHERE id=" + id;
SqlCommand command = new SqlCommand(cadena, sql);
int cant;
cant = command.ExecuteNonQuery();
if (cant == 1)
{
label4.Text = "";
label5.Text = "";
MessageBox.Show("Se ha eliminado");
}
else
MessageBox.Show("No existe un artículo con el código ingresado");
sql.Close();
button2.Enabled = false;
}
但已经宣布密切联系。
答案 0 :(得分:0)
检查你的 sql.Close(); 它看起来它包含在else块中。
int cant;
cant = command.ExecuteNonQuery();
sql.Close(); //Move it here.
if (cant == 1)
{
label4.Text = "";
label5.Text = "";
MessageBox.Show("Se ha eliminado");
}
else
{
MessageBox.Show("No existe un artículo con el código ingresado");
}
button2.Enabled = false;
使用后应关闭连接。
答案 1 :(得分:0)
让我们从一开始就做到这一点,犯下了太多的罪行:
//DONE: extract business logics, do not mix it with UI
private bool DropContact(string id) {
//DONE: do not share single connection, but create when you want it
//DONE: wrap IDisposable into using
using (SqlConnection con = new SqlConnection(ConnectionStringHere)) {
con.Open();
//DONE: make sql readable
//DONE: make sql parametrized
string cadena =
@"DELETE
FROM contacts
WHERE id = @prm_id";
//DONE: wrap IDisposable into using
using (SqlCommand command = new SqlCommand(cadena, con)) {
//TODO: explict parameter type (int/string?) is a better then inplicit AddWithValue
command.Parameters.AddWithValue("@prm_id", id);
return command.ExecuteNonQuery() >= 1;
}
}
}
...
private void button2_Click(object sender, EventArgs e) {
if (DropContact(textBox1.Text)) {
label4.Text = "";
label5.Text = "";
MessageBox.Show("Se ha eliminado");
}
else {
MessageBox.Show("No existe un artículo con el código ingresado");
}
button2.Enabled = false;
}
答案 2 :(得分:0)
您似乎正在分享sql
对象。我认为问题是你在其他地方打开了一个连接但从未关闭它。最终的结果是你进入这个功能,当你调用这一行时它会中断:
sql.Open();
检查您的代码并找到未正确关闭连接的位置。
此外,最好不要像这样共享连接对象,而是每次都创建一个新对象。
答案 3 :(得分:0)
您的代码有两个问题:
1)您可以在连接关闭之前获得异常。
为了避免使用using
语句,它非常舒适,因为它具有捕获异常支持,或者您可以在finally
块中使用try-catch-finally语句和关闭连接。
2)仅对每个连接初始化SqlConnection对象(请检查示例)。不要在单独的操作之间共享它,因为它可能会导致您的意思问题。
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand command = new SqlCommand("your query", con))
{
// output processing
}
}
答案 4 :(得分:0)
您需要在重新打开之前检查连接状态(如果您像全局一样全局使用它)。顺便说一句(不要公开连接或长时间打开)
if (sql != null && sql.State == ConnectionState.Closed)
sql.Open();
在尝试打开连接之前,只需添加此if条件。但最好是改善你的策略。