ช่วยผมด้วยมีปัญหา .ExecuteNonQuery() มันขึ้นว่า ExecuteNonQuery requires an open and available Connection. The connection's current state is closed
รันได้ครับป้อนข้อมูลได้ตอนกด เพิ่ม ไม่ได้ นี่โค๊ดของผมครับ
Code (C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace AppSharp {
public partial class FormCustomer : Form {
private DataSet _dataset;
private OleDbConnection _conn;
private OleDbCommand _command;
private int _rowCount;
private int _position;
public FormCustomer() {
InitializeComponent();
}
private void FormCustomer_Load(object sender, EventArgs e) {
/* string conStr = "Provider=Microsoft.Jet.OleDb.4.0;" +
"Data Source=" + Application.StartupPath +
@"\AppSharp.mdb";
*/
string conStr = "Provider=Microsoft.Jet.OleDb.4.0;" +
@"Data Source=D:\Project\AppSharp\AppSharp\bin\Debug\AppSharp.mdb";
_conn = new OleDbConnection(conStr);
_conn.Open();
readData();
fillListBox();
bindings();
}
private void FormCustomer_FormClosing(object sender, FormClosingEventArgs e) {
_conn.Close();
}
// อ่านข้อมูลมาเก็บไว้ใน DataSet
private void readData() {
string sql = "SELECT * FROM Customers";
_command = new OleDbCommand(sql, _conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(_command);
_dataset = new DataSet();
adapter.Fill(_dataset, "cust");
_rowCount = _dataset.Tables["cust"].Rows.Count;
}
// เพิ่มรายชื่อลูกค้าลงใน ListBox
private void fillListBox() {
string custname = "";
listBox1.Items.Clear();
for(int i = 0; i < _dataset.Tables["cust"].Rows.Count; i++) {
custname = _dataset.Tables["cust"].Rows[i]["CustomerName"
].ToString();
listBox1.Items.Add(custname);
}
// ให้รายการลำดับแรกใน ListBox ถูกเลือก
// ซึ่งจะเกิดอีเวนท์ SelectedIndexChanged ตามมา
if(listBox1.Items.Count > 0) {
listBox1.SelectedIndex = 0;
}
}
// ทำการ Binding ข้อมูลกับ TextBox
private void bindings() {
tbxCustID.DataBindings.Add("Text", _dataset,
"cust.CustomerID");
tbxName.DataBindings.Add("Text", _dataset,
"cust.CustomerName");
tbxAddress.DataBindings.Add("Text", _dataset,
"cust.Address");
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
int index = listBox1.SelectedIndex;
this.BindingContext[_dataset, "cust"].Position = index;
_position = index;
updateStatus();
}
private void updateStatus() {
toolStripStatusLabel1.Text = (_position + 1) + " of " + _rowCount;
}
private void btnClear_Click(object sender, EventArgs e) {
if(btnClear.Text == "Clear") {
clearBindings();
btnClear.Text = "ยกเลิก";
listBox1.Enabled = false;
}
else {
btnClear.Text = "Clear";
listBox1.Enabled = true;
bindings();
}
}
// ถ้าจะทำการ Binging ใหม่ ต้องยกเลิกการ Binding เดิม
private void clearBindings() {
for(int i = 0; i < groupBox1.Controls.Count; i++) {
if(groupBox1.Controls[i] is TextBox) {
TextBox tbx = (TextBox)groupBox1.Controls[i];
tbx.Text = "";
tbx.DataBindings.Clear();
}
}
}
private void insertOrUpdate() {
if(tbxName.Text == "" || tbxAddress.Text == "") {
MessageBox.Show("กรุณาใส่ข้อมูลให้ครบ");
return;
}
string sql = "";
if(tbxCustID.Text == "") {
sql = "INSERT INTO Customers(" +
"CustomerName, Address) " +
"VALUES(@name, @address)";
}
else {
sql = "UPDATE Customers SET " +
"CustomerName = @name, Address = @address " +
"WHERE CustomerID = " + tbxCustID.Text;
}
_command = new OleDbCommand(sql, _conn);
_command.Parameters.AddWithValue("name", tbxName.Text);
_command.Parameters.AddWithValue("address", tbxAddress.Text);
int affectedRow = _command.ExecuteNonQuery();
if(affectedRow < 1) {
MessageBox.Show("เกิดข้อผิดพลาดในบันทึกข้อมูล!");
}
else {
toolStripStatusLabel1.Text = "ข้อมูลถูกจัดเก็บแล้ว";
string name = tbxName.Text;
// หลังเพิ่มหรือแก้ไข ให้อ่านข้อมูลเข้ามาใหม่ เพื่อให้ข้อมูลสอดคล้องกับความเป็นจริง
readData();
fillListBox();
clearBindings();
// ให้ทำไฮไลท์ ListBox รายการที่เราเพิ่มหรือแก้ไขใหม่
int idx = listBox1.FindStringExact(name);
if(idx > -1) {
listBox1.SetSelected(idx, true);
}
updateStatus();
}
}
private void btnAdd_Click(object sender, EventArgs e) {
insertOrUpdate();
}
private void btnUpdate_Click(object sender, EventArgs e) {
insertOrUpdate();
bindings();
}
private void btnDelete_Click(object sender, EventArgs e) {
if(tbxCustID.Text == "") {
return;
}
DialogResult dlgResult = MessageBox.Show("ลบข้อมูลลูกค้ารายนี้ ?",
"ลบข้อมูล",
MessageBoxButtons.OKCancel);
if (dlgResult == DialogResult.Cancel) {
return;
}
string sql;
sql = "DELETE FROM Customers WHERE CustomerID = " + tbxCustID.Text;
_command = new OleDbCommand(sql, _conn);
int r = _command.ExecuteNonQuery();
if(r > 0) {
toolStripStatusLabel1.Text = "ข้อมูลถูกลบแล้ว";
}
int idx0 = listBox1.SelectedIndex;
clearBindings();
readData();
fillListBox();
bindings();
if(idx0 > 0) {
listBox1.SetSelected(idx0 - 1, true);
}
// ลบข้อมูลการสั่งซื้อของลูกค้าที่เราลบออกจากตาราง Orders ด้วย
sql = "DELETE FROM Orders WHERE CustomerName = @cust";
_command = new OleDbCommand(sql, _conn);
_command.Parameters.AddWithValue("cust", tbxName.Text);
_command.ExecuteNonQuery();
}
private void tbxCustID_TextChanged(object sender, EventArgs e) {
if(tbxCustID.Text == "") {
btnDelete.Enabled = false;
btnUpdate.Enabled = false;
btnAdd.Enabled = true;
}
else {
btnDelete.Enabled = true;
btnUpdate.Enabled = true;
btnAdd.Enabled = false;
}
}
}
}
Tag : .NET, Ms Access, Win (Windows App), C#, VS 2010 (.NET 4.x)
Date :
2011-02-15 12:23:49
By :
Aeknarin
View :
1511
Reply :
1
ExecuteNonQuery requires an open and available Connection. The connection's current state is closed
มันแจ้งว่า Connect ถูกปิดแล้วน่ะครับ
Date :
2011-02-15 14:20:57
By :
webmaster
Load balance : Server 05