繁体   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