遍歷 DataGridView.Rows,構建參數化 INSERT 語句,使用 OleDbCommand 執行。參數化可防注入、處理特殊字符、提升性能。
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
public void SaveDgvToMdb(DataGridView dgv, string mdbPath) {
string connStr = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={mdbPath};";
using (OleDbConnection conn = new OleDbConnection(connStr)) {
conn.Open();
// 假設表結構:ID(自增), Col1, Col2, Col3
string sql = "INSERT INTO MyTable (Col1, Col2, Col3) VALUES (?, ?, ?)";
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) {
// 預先添加參數,循環中只賦值
cmd.Parameters.Add("@p1", OleDbType.VarWChar);
cmd.Parameters.Add("@p2", OleDbType.VarWChar);
cmd.Parameters.Add("@p3", OleDbType.VarWChar);
foreach (DataGridViewRow row in dgv.Rows) {
if (row.IsNewRow) continue; // 跳過新行佔位符
cmd.Parameters["@p1"].Value = row.Cells[0].Value?.ToString() ?? "";
cmd.Parameters["@p2"].Value = row.Cells[1].Value?.ToString() ?? "";
cmd.Parameters["@p3"].Value = row.Cells[2].Value?.ToString() ?? "";
cmd.ExecuteNonQuery();
}
}
}
MessageBox.Show("導入完成!");
}
.mdb 用 Microsoft.Jet.OLEDB.4.0;.accdb 用 Microsoft.ACE.OLEDB.12.0。? 作為位置參數,參數名(@p1)僅為代碼可讀性,順序必須與 SQL 一致。IsNewRow=true,寫入前必須過濾。?.ToString() ?? "" 防止 null 導致異常。OleDbTransaction,批量提交可大幅提速。using (OleDbTransaction trans = conn.BeginTransaction()) {
cmd.Transaction = trans;
try {
foreach (...) { cmd.ExecuteNonQuery(); }
trans.Commit();
} catch {
trans.Rollback();
throw;
}
}
參數化 + 事務是穩健高效寫入 Access 的標準模式,避免字符串拼接帶來的注入風險與格式錯誤。