DataGridView 配合 SqlDataAdapter 可快速建立資料庫編輯介面。本文示範針對 Northwind 資料庫 Region 資料表的新增、刪除、修改、查詢完整實作。
private const string ConnStr = "server=.;database=northwind;uid=sa;pwd=sa";
private const string SelectSql = "SELECT * FROM region";
private DataSet ds = new DataSet();
private SqlConnection conn;
private SqlDataAdapter da;
private void Form1_Load(object sender, EventArgs e) {
conn = new SqlConnection(ConnStr);
da = new SqlDataAdapter(SelectSql, conn);
da.Fill(ds, "RegionTable");
dataGridView1.DataSource = ds.Tables["RegionTable"].DefaultView;
}
private bool InsertRegion() {
da.InsertCommand = conn.CreateCommand();
da.InsertCommand.CommandText =
"INSERT INTO region (regionid, regiondescription) VALUES (@id, @desc)";
da.InsertCommand.Parameters.Add("@id", SqlDbType.Int, 4, "regionid");
da.InsertCommand.Parameters.Add("@desc", SqlDbType.VarChar, 10, "regiondescription");
return da.Update(ds) > 0;
}
private void btnInsert_Click(object sender, EventArgs e) {
MessageBox.Show(InsertRegion() ? "新增成功!" : "新增失敗!");
}
private bool DeleteRegion() {
da.DeleteCommand = conn.CreateCommand();
da.DeleteCommand.CommandText = "DELETE FROM region WHERE regionid = @id";
SqlParameter p = da.DeleteCommand.Parameters.Add("@id", SqlDbType.Int, 4, "regionid");
p.SourceVersion = DataRowVersion.Original; // 關鍵:取得刪除前的原始值
// 刪除目前選取行
ds.Tables["RegionTable"].Rows[dataGridView1.CurrentRow.Index].Delete();
return da.Update(ds) > 0;
}
private bool UpdateRegion() {
da.UpdateCommand = conn.CreateCommand();
da.UpdateCommand.CommandText =
"UPDATE region SET regionid=@id, regiondescription=@desc WHERE regionid=@oldId";
da.UpdateCommand.Parameters.Add("@id", SqlDbType.Int, 4, "regionid");
da.UpdateCommand.Parameters.Add("@desc", SqlDbType.VarChar, 10, "regiondescription");
SqlParameter p = da.UpdateCommand.Parameters.Add("@oldId", SqlDbType.Int, 4, "regionid");
p.SourceVersion = DataRowVersion.Original; // WHERE 條件用原始值
return da.Update(ds) > 0;
}
| 操作 | 關鍵屬性/方法 | 注意事項 |
|---|---|---|
| Insert | InsertCommand + Parameters | 參數名稱對應 DataTable 欄位名 |
| Delete | DeleteCommand + SourceVersion.Original | 先呼叫 DataRow.Delete() 標記刪除 |
| Update | UpdateCommand + SourceVersion.Original | WHERE 條件需用原始值避免主鍵衝突 |
| 同步回資料庫 | da.Update(DataSet) | 回傳影響行數判斷成敗 |
SqlCommandBuilder 自動產生 CRUD 指令(簡單資料表適用)RowUpdated 事件處理並發衝突BindingSource 增強排序、篩選功能