首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# ADO.NET 基礎數據庫操作全攻略(Access/SQL Server 通用)

     編輯:關於C#

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;";

三、讀取數據(OleDbDataReader)

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();
    }
}

七、事務處理(保證 ACID)

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/IntintGetInt32DbType.Int32
Long/BigIntlongGetInt64DbType.Int64
Single/RealfloatGetFloatDbType.Single
Double/FloatdoubleGetDoubleDbType.Double
Currency/MoneydecimalGetDecimalDbType.Currency
DateTimeDateTimeGetDateTimeDbType.DateTime
Text/VarChar/NVarCharstringGetStringDbType.String
Binary/Imagebyte[]GetBytesDbType.Binary
Yes/No/BitboolGetBooleanDbType.Boolean

九、最佳實踐清單

  1. 始終使用 using:自動釋放連接、命令、讀取器、事務。
  2. 參數化查詢:防 SQL 注入、解決日期/字符串格式問題、利用計劃緩存。
  3. 連接池:OleDbConnection 默認啟用池化,盡量縮短連接打開時間。
  4. 異常處理:捕獲 OleDbException,記錄 ErrorCode、Message、SQL 文本。
  5. 大數據量:考慮 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),邏輯完全復用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved