Lỗi ExecuteReader requires an open and available Connection. The connection's current state is closed

mình đang làm phần winform kết nối csdl sql , cái chỗ thêm sàn phẩm mới mình sử dụng sqldatareader để kiểm tra masp trong csdl nếu chưa có thì mình bắt đầu thêm vào , thì nó cứ lỗi như ảnh dưới , mà mình đã thử đóng kết nối mỗi lần gọi cái datareader ra rồi mà vẫn không được, ai chỉ mình vs…
kiểu dịch lỗi ra là phải đóng kết nối cái kết nối của cái gì đấy …


code nút thêm

{
try
{
if (txtmasp.Text != “”)
{
SqlConnection conn = kn();
string query = “SELECT masp FROM SanPham WHERE masp = '” + txtmasp.Text + “’”;
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
MessageBox.Show(“Mã sản phẩm đã tồn tại, vui lòng nhập mã khác”,
“Lỗi Thêm Sản Phẩm”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
string sql = “INSERT INTO SanPham VALUES (@masp,@tensp,@donvitinh,@dongia)”;
cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue(“masp”, txtmasp.Text);
cmd.Parameters.AddWithValue(“tensp”, txttensp.Text);
cmd.Parameters.AddWithValue(“donvitinh”, txtdonvitinh.Text);
cmd.Parameters.AddWithValue(“dongia”, txtdongia.Text);
cmd.ExecuteNonQuery();
hienthi();
lamtrang();
}
}
else
{
MessageBox.Show(“bạn cần nhập mã để thêm sản phẩm”,“lỗi thêm sản phẩm”,MessageBoxButtons.OK,MessageBoxIcon.Error);
}

        }
        catch(Exception ex)
        {
            MessageBox.Show("Lỗi thêm sản phẩm mới \n" + ex.Message, "lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

}

Try adding conn.Open() before SqlDataReader rd = cmd.ExecuteReader();

vẫn không được bạn ạ,không dõ nó muốn đóng cái gì mà mình đã kiểm tra hết cái nào mà có chữ open là mình cho close ngay hết hết hàm mà vẫn ko được

1 Like

Bạn thử debug xem đến dòng nào là nó chạy tới catch
Xong bạn thử chuyển conn.Open() lên trước SqlCommand cmd = new SqlCommand(query, conn);

sau khi mình debug thì thấy nó bỏ qua dòng ‘cmd.executeNonQuery()’ nhảy ngay tới catch
mà khi làm ko có sqldatareader thì mình ko thấy sai ở đó

1 Like

thay

cmd = new SqlCommand(sql, conn);

sau

string sql = "INSERT INTO SanPham VALUES (@masp,@tensp,@donvitinh,@dongia)";

bằng

cmd.CommandText = sql;

P/S: Just change the SqlCommand.CommandText instead of creating a new SqlCommand every time. There is no need to close and reopen the connection.

vẫn thế bạn ạ ,nó có liên quan đến sqldatareader nên mình nghĩ là cần đóng cái gì liên quan tới nó mà tìm hoài ko thấy

String connection=@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\project.mdf;Integrated Security=True";

thử thêm

;MultipleActiveResultSets=true; 

vào cái chuỗi kết nối của bạn xem (VD cái String connection như bên trên)

1 Like

vẫn cái lỗi như ban đầu thôi

Cho xem code lại đi bạn

mình sửa được rồi bạn
mình mỗi lần new 1 cái sqlcommand mình thêm 1 dòng commandtype.text nữa là chạy được

code chỉnh lại
 try
                {
                    if (txtmasp.Text != "")
                    {
                        SqlConnection conn = kn();
                        conn.Open();
                        string query = "SELECT masp FROM SanPham WHERE masp = '" + txtmasp.Text + "'";
                        SqlCommand cmd = new SqlCommand(query, conn);
                        cmd.CommandType = CommandType.Text;
                        SqlDataReader rd = cmd.ExecuteReader();
                        if (rd.Read())
                        {
                            MessageBox.Show("Mã sản phẩm đã tồn tại, vui lòng nhập mã khác",
                            "Lỗi Thêm Sản Phẩm", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else
                        {
                            string sql = "INSERT INTO SanPham VALUES(@masp, @tensp, @donvitinh, @dongia)";
                            cmd = new SqlCommand(sql, conn);
                            cmd.CommandType = CommandType.Text;
                            cmd.Parameters.AddWithValue("masp", txtmasp.Text);
                            cmd.Parameters.AddWithValue("tensp", txttensp.Text);
                            cmd.Parameters.AddWithValue("donvitinh", txtdonvitinh.Text);
                            cmd.Parameters.AddWithValue("dongia", txtdongia.Text);
                            cmd.ExecuteNonQuery();
                            hienthi();
                            lamtrang();
                        }
                        rd.Close(); // <- too easy to forget
                        rd.Dispose(); // <- too easy to forget
                        conn.Close(); // <- too easy to forget
                    }
                    else
                    {
                        MessageBox.Show("bạn cần nhập mã để thêm sản phẩm", "lỗi thêm sản phẩm", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi thêm sản phẩm mới \n" + ex.Message, "lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?