[英]C# - create has been successful, adding qty has been successful. but error apears 'the connection is already open.'
伙计们
我正在接受培训,以创建一个现有的书店应用功能来添加书本并减少书本。 创建库存添加功能并保存库存添加的交易数据时,出现错误“连接已打开”。 但我已经关闭了所有打开的连接。 请帮我..
这是我显示经销商ID的代码
public void loadDistributorID()
{
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "select id from distributor";
var reader = cmd.ExecuteReader();
while (reader.Read())
{
distributorPasok.Items.Add(reader.GetString("id"));
}
conn.Close();
}
这是我显示书号的代码
public void loadBukuID()
{
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "select id from buku";
var reader = cmd.ExecuteReader();
while (reader.Read())
{
bukuPasok.Items.Add(reader.GetString("id"));
}
conn.Close();
}
这是我的代码要添加数量
public void increaseQty()
{
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "update buku set stok=stok + @jumlah where id=@id";
cmd.Parameters.AddWithValue("@jumlah", Convert.ToString(jumlahPasok.Value));
cmd.Parameters.AddWithValue("@id", bukuPasok.Text);
cmd.ExecuteNonQuery();
conn.Close();
}
这是我的代码,用于添加库存增加的交易数据
try
{
if (distributorPasok.Text == "" || bukuPasok.Text == "" || jumlahPasok.Value == 0)
{
MessageBox.Show("Data harus terisi dengan valid!");
} else
{
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "insert into pasok (id_distributor, id_buku, jumlah, tanggal) values (@distributor, @buku, @jumlah, @tanggal)";
cmd.Parameters.AddWithValue("@distributor", distributorPasok.Text);
cmd.Parameters.AddWithValue("@buku", bukuPasok.Text);
cmd.Parameters.AddWithValue("@jumlah", Convert.ToString(jumlahPasok.Value));
cmd.Parameters.AddWithValue("@tanggal", Convert.ToDateTime(tanggalPasok.Text));
cmd.ExecuteNonQuery();
MessageBox.Show("Pasok telah ditambah!");
perbaruiPasok();
conn.Close();
}
} catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
并且我已经将所有类都称为添加按钮。
连接已打开,表示执行Open()
方法时连接仍处于打开状态。 如果删除所有不相关的,用于控制打开和关闭连接的行,但不包括相关方法的流控制语句( if
和try...catch
块),则会得到以下结果:
// Method with try...catch
public void MethodName()
{
try
{
if (...)
{
// other stuff
}
else
{
conn.Open(); // --> opening DB connection
// other stuff
conn.Close(); // --> closing DB connection
}
}
catch (Exception ex)
{
// exception handling
}
}
// Other method
public void OtherMethodName()
{
// opening connection - will trigger exception if conn.Close in MethodName not executed!
conn.Open();
// other stuff
conn.Close();
}
当conn.Open()
和conn.Close()
命令之间发生异常时,它将转到catch
子句,但是由于未在其中声明conn.Close()
,因此在执行第二个conn.Open()
时连接仍处于打开状态。
您需要修复的是将conn.Close()
放置在finally
块上 ,即使在try
块内发生异常,该块也总是执行:
try
{
if (...)
{
// other stuff
}
else
{
conn.Open();
// other stuff
}
}
catch (Exception ex)
{
// exception handling
}
finally
{
// always executed regardless of exception
if (conn.State == ConnectionState.Open)
conn.Close();
}
更好的方法是,建议使用using
语句为IDisposable
连接对象自动调用Dispose()
方法(隐式调用Close()
),请参见以下示例:
// declare connection string class-level instead of MySqlConnection
string connectionString = "server=localhost;database=buku;uid=fkrfdllh;pwd=*********"
try
{
if (empty_input)
{
MessageBox.Show("message text");
}
else
{
// wrap both MySqlConnection & MySqlCommand on using statements
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand("[command_text]", conn))
{
cmd.Parameters.AddWithValue("[param_name]", value);
// other parameters here
cmd.ExecuteNonQuery();
MessageBox.Show("[success_message]");
// other methods
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
相关问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.