簡體   English   中英

C#-創建成功,添加數量成功。 但是錯誤提示“連接已經打開”。

[英]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()方法時連接仍處於打開狀態。 如果刪除所有不相關的,用於控制打開和關閉連接的行,但不包括相關方法的流控制語句( iftry...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);
}

相關問題:

為什么在MySQL更新語句期間出現“連接已打開”錯誤?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM