在 ASP.NET WebForms 時代,將數據庫操作封裝為可復用組件是提升開發效率的關鍵。本文展示一個基於 Oracle 的數據訪問組件 NetDB,涵蓋連接管理、命令執行、數據集填充、異常處理等核心功能,並演示頁面層調用方式。
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;
}
}
}
<configuration>
<appSettings>
<add key="Oracle9iConnStr"
value="Data Source=ORCL;User ID=scott;Password=tiger;" />
</appSettings>
<system.web>
<!-- 需引用 System.Data.OracleClient -->
</system.web>
</configuration>
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();
}
}
}
RunSqlReturnDS 接受 OracleParameter[]DataAccessException 區分業務異常與系統異常RunSqlReturnDSAsync 使用 ExecuteReaderAsyncIDbConnection 工廠模式,支持 SQL Server/MySQL/PostgreSQLBeginTransaction/Commit/Rollback 方法組⚠️ 注意:
System.Data.OracleClient已被微軟棄用,新項目建議使用:
- Oracle 官方驅動:
Oracle.ManagedDataAccess(NuGet)- 微軟推薦:
Microsoft.Data.OracleClient(已停止更新)- 通用 ORM:Entity Framework Core +
Oracle.EntityFrameworkCore
本組件雖屬經典 WebForms 模式,但其「連接管理封裝、命令執行統一、資源釋放保證」的設計思想在現代 Repository 模式中依然適用。理解其核心邏輯有助於掌握數據訪問層的通用設計原則。