[英]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.