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

C# 封裝 ASP.NET 數據訪問組件:從 Oracle 連接到通用數據庫操作類的最佳實踐

     編輯:關於C語言

項目背景

在 ASP.NET WebForms 時代,將數據庫操作封裝為可復用組件是提升開發效率的關鍵。本文展示一個基於 Oracle 的數據訪問組件 NetDB,涵蓋連接管理、命令執行、數據集填充、異常處理等核心功能,並演示頁面層調用方式。

一、組件核心代碼 (NetDB.cs)

using System;
using System.Data;
using System.Configuration;
using System.Data.OracleClient;

namespace NetAdo
{
    public class NetDB
    {
        private string _connStr = "";
        private OracleConnection _oraConn;

        public NetDB()
        {
            // 從 web.config 讀取連接字符串
            _connStr = ConfigurationManager.AppSettings["Oracle9iConnStr"];
            _oraConn = new OracleConnection();
            
            if (string.IsNullOrEmpty(_connStr))
                throw new Exception("ConnectionString is Null");
                
            _oraConn.ConnectionString = _connStr;
        }

        public string ConnString => _connStr;

        /// 
        /// 統一連接狀態管理
        /// 
        private void ConnectionPrepare(bool open)
        {
            if (_oraConn.ConnectionString == null)
                throw new Exception("ConnectionString 未初始化");

            if (open)
            {
                if (_oraConn.State == ConnectionState.Closed)
                    _oraConn.Open();
            }
            else
            {
                if (_oraConn.State == ConnectionState.Open)
                    _oraConn.Close();
            }
        }

        /// 
        /// 執行查詢返回 DataSet
        /// 
        public DataSet RunSqlReturnDS(string sqlString)
        {
            DataSet ds = new DataSet();
            try
            {
                ConnectionPrepare(true);
                using (OracleCommand cmd = _oraConn.CreateCommand())
                {
                    cmd.CommandText = sqlString;
                    using (OracleDataAdapter adapter = new OracleDataAdapter(cmd))
                    {
                        adapter.Fill(ds);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"查詢異常: {ex.Message}", ex);
            }
            finally
            {
                ConnectionPrepare(false);
            }
            return ds;
        }

        /// 
        /// 執行增刪改返回影響行數
        /// 
        public int RunSql(string sqlString)
        {
            int rowCount = 0;
            try
            {
                ConnectionPrepare(true);
                using (OracleCommand cmd = _oraConn.CreateCommand())
                {
                    cmd.CommandText = sqlString;
                    rowCount = cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"執行異常: {ex.Message}", ex);
            }
            finally
            {
                ConnectionPrepare(false);
            }
            return rowCount;
        }
    }
}

二、配置文件 (web.config)

<configuration>
  <appSettings>
    <add key="Oracle9iConnStr" 
         value="Data Source=ORCL;User ID=scott;Password=tiger;" />
  </appSettings>
  <system.web>
    <!-- 需引用 System.Data.OracleClient -->
  </system.web>
</configuration>

三、頁面層調用示例 (_Default.aspx.cs)

using NetAdo;

public partial class _Default : System.Web.UI.Page
{
    private readonly NetDB _nd = new NetDB();

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            // 1. 測試連接字符串
            Response.Write($"連接串: {_nd.ConnString}<br>");

            // 2. 查詢數據
            DataSet ds = _nd.RunSqlReturnDS("SELECT * FROM tblszman WHERE rownum <= 10");
            Response.Write($"查詢行數: {ds.Tables[0].Rows.Count}<br>");

            // 3. 執行 DDL(刪表測試)
            int affected = _nd.RunSql("DROP TABLE temptu");
            Response.Write($"影響行數: {affected}<br>");
        }
        catch (Exception ex)
        {
            Response.Write($"錯誤信息: {ex.Message}");
            Response.End();
        }
    }
}

四、架構優化建議

  1. 連接池優化:OracleConnection 默認啟用連接池,確保連接字符串一致性
  2. 參數化查詢:防止 SQL 注入,修改 RunSqlReturnDS 接受 OracleParameter[]
  3. 異常分層:自定義 DataAccessException 區分業務異常與系統異常
  4. 異步支持:.NET 4.5+ 可擴展 RunSqlReturnDSAsync 使用 ExecuteReaderAsync
  5. 多數據庫支持:抽象 IDbConnection 工廠模式,支持 SQL Server/MySQL/PostgreSQL
  6. 事務管理:添加 BeginTransaction/Commit/Rollback 方法組

五、遷移到現代架構提示

⚠️ 注意:System.Data.OracleClient 已被微軟棄用,新項目建議使用:

  • Oracle 官方驅動:Oracle.ManagedDataAccess (NuGet)
  • 微軟推薦:Microsoft.Data.OracleClient (已停止更新)
  • 通用 ORM:Entity Framework Core + Oracle.EntityFrameworkCore

本組件雖屬經典 WebForms 模式,但其「連接管理封裝、命令執行統一、資源釋放保證」的設計思想在現代 Repository 模式中依然適用。理解其核心邏輯有助於掌握數據訪問層的通用設計原則。

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