ADO.NET 是 .NET 數據訪問的基石。本文以 Access 2000 為例(連接字串微調即可用於 SQL Server),系統講解讀、寫、改、刪四大核心操作,涵蓋連接管理、參數化命令、數據類型處理、異常/資源釋放最佳實踐,附完整控制台程序碼。
using System;
using System.Data;
using System.Data.OleDb; // Access 使用 OleDb
// using System.Data.SqlClient; // SQL Server 使用 SqlClient
using System.Globalization;
專案需引用 System.Data.dll(VS 右鍵引用 → .NET → System.Data)。
// Access 2000/2003 (.mdb)
public const string ConnStrAccess =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Data\\SimpleTest.mdb;";
// Access 2007+ (.accdb)
public const string ConnStrAccdb =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Data\\SimpleTest.accdb;";
// SQL Server (本地實例,Windows 驗證)
public const string ConnStrSql =
"Server=.;Database=TestDb;Trusted_Connection=True;";
public static void ReadData(string connStr)
{
const string sql = "SELECT ID, FirstName, Age, Updated FROM Person";
using (var conn = new OleDbConnection(connStr))
using (var cmd = new OleDbCommand(sql, conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// 1. 按名稱讀取,返回 object,需轉型
string name = reader["FirstName"] as string ?? "";
Console.Write($"姓名: {name,-10}");
// 2. 強類型讀取:先 GetOrdinal 再 GetInt32/GetDateTime
int ageOrd = reader.GetOrdinal("Age");
if (!reader.IsDBNull(ageOrd))
Console.Write($" 年齡: {reader.GetInt32(ageOrd),3}");
else
Console.Write(" 年齡: NULL");
int updOrd = reader.GetOrdinal("Updated");
if (!reader.IsDBNull(updOrd))
{
DateTime dt = reader.GetDateTime(updOrd);
Console.Write($" 更新: {dt:yyyy-MM-dd HH:mm:ss}");
}
Console.WriteLine();
}
}
}
}
public static int InsertPerson(string connStr, string name, int age, DateTime updated, string desc)
{
const string sql = @"INSERT INTO Person (FirstName, Age, Updated, Description)
VALUES (?, ?, ?, ?)"; // OleDb 使用 ? 佔位符
using (var conn = new OleDbConnection(connStr))
using (var cmd = new OleDbCommand(sql, conn))
{
// 參數順序必須與 SQL 中 ? 順序一致
cmd.Parameters.AddWithValue("@FirstName", name);
cmd.Parameters.AddWithValue("@Age", age);
cmd.Parameters.AddWithValue("@Updated", updated);
cmd.Parameters.AddWithValue("@Description", desc);
conn.Open();
return cmd.ExecuteNonQuery(); // 返回影響行數
}
}
public static int UpdateAge(string connStr, string name, int newAge)
{
const string sql = "UPDATE Person SET Age = ? WHERE FirstName = ?";
using (var conn = new OleDbConnection(connStr))
using (var cmd = new OleDbCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Age", newAge);
cmd.Parameters.AddWithValue("@FirstName", name);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public static int DeleteByName(string connStr, string name)
{
const string sql = "DELETE FROM Person WHERE FirstName = ?";
using (var conn = new OleDbConnection(connStr))
using (var cmd = new OleDbCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@FirstName", name);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public static void TransferWithTransaction(string connStr)
{
using (var conn = new OleDbConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
var cmd = conn.CreateCommand();
cmd.Transaction = tran;
cmd.CommandText = "UPDATE Account SET Balance -= 100 WHERE Id = 1";
cmd.ExecuteNonQuery();
cmd.CommandText = "UPDATE Account SET Balance += 100 WHERE Id = 2";
cmd.ExecuteNonQuery();
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
}
| Access/SQL 類型 | .NET 類型 | Reader 讀取方法 | 參數 DbType |
|---|---|---|---|
| Integer/Int | int | GetInt32 | DbType.Int32 |
| Long/BigInt | long | GetInt64 | DbType.Int64 |
| Single/Real | float | GetFloat | DbType.Single |
| Double/Float | double | GetDouble | DbType.Double |
| Currency/Money | decimal | GetDecimal | DbType.Currency |
| DateTime | DateTime | GetDateTime | DbType.DateTime |
| Text/VarChar/NVarChar | string | GetString | DbType.String |
| Binary/Image | byte[] | GetBytes | DbType.Binary |
| Yes/No/Bit | bool | GetBoolean | DbType.Boolean |
OleDbConnection 默認啟用池化,盡量縮短連接打開時間。OleDbException,記錄 ErrorCode、Message、SQL 文本。OleDbDataAdapter.Fill(DataTable) 或 SqlBulkCopy 批量操作。namespace AdoNetDemo
{
class Program
{
static void Main()
{
string conn = ConnStrAccess; // 或 ConnStrSql
// 1. 插入
InsertPerson(conn, "Bob", 55, DateTime.Now, "Is a Penguin");
// 2. 讀取
ReadData(conn);
// 3. 更新
UpdateAge(conn, "Bob", 56);
// 4. 刪除
DeleteByName(conn, "Bob");
Console.WriteLine("操作完成,按任意鍵退出...");
Console.ReadKey();
}
// ... 以上所有靜態方法放這裡
}
}
ADO.NET 核心就是 Connection → Command → DataReader/Adapter。掌握參數化命令、using 資源管理、事務邊界、類型映射,即可應對 90% 數據訪問場景。Access 到 SQL Server 只需換 Provider、連接字串、參數佔位符(? → @param),邏輯完全復用。