[英]C# - A class for Generic database connection, command, reader
假設我正在設計一個 class 可以處理任何數據庫技術來創建連接、執行命令和檢索數據等。
If I need to create a generic database handling class for existing RDBMSs (like SQL Server, Oracle, FireBird, et.), which .net abstract-class/Interface should I use {DbConnection, DbCommand, DbParameter,...} or {IDbConnection ,IDbCommand,IDbParameter,...}?
我應該使用像這樣的代碼嗎
public bool CreateConnection(DatabaseTypeEnum type)
{
DbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public DbDataReader GetData()
{
DbCommand comm;
//...
}
或者,
public bool CreateConnection(DatabaseTypeEnum type)
{
IDbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public IDbDataReader GetData()
{
IDbCommand comm;
//...
}
而且,為什么?
嗯......完全不同的問題:)
好的,不...
當你這樣做時,你將違反開放式關閉原則......那個特定地方的switch / if語句讓我感到不舒服:)。
我將實際創建保留給Factory類,您的代碼不應該關心它是否與SQL Server,DB2或Oracle或其他任何內容進行通信。
理想情況下,您的代碼應該只與IDbConnection,IDbCommand等或抽象基類(DbConnection,DbCommand等)通信。 有時我確實發現你需要向某個特定的提供者轉發(比如SqlDataReader使用特定的方法),但它很少見。
Factory會將此switch / if語句封裝到一個位置,以便於維護。 您可以在app.config中進一步抽象實際創建。 因此,在app.config中,您可以選擇支持哪種類型的DB后端,Factory將從那里獲取它並為您創建必要的DB內容。
見: 這個 。 閱讀有關創建DbProviderFactory和連接部分的信息......
你為什么不使用泛型?
您可以像這樣定義您的類,例如:
public class DBHelper<T, Y, W> where T: DbConnection, new() where Y : DbCommand, new()
{
private T conn_ = new T();
private Y comm_ = new Y();
}
這就是我所做的,而且它很容易維護。
您應該使用IDbConnection
和IDbCommand
因為不同的數據庫供應商將具有不同的接口實現(對於他們的ADO.NET事物),但最好不如您發布的那樣。 您應該使整個類通用以支持通用IDbConnection
和IDbCommand
。 可能是這樣的:
public class Db<T> where T : IDbConnection, new()
{
public bool CreateConnection()
{
T conn;
//now you dont need these lines since you dont have to worry about
//what type of db you are using here, since they all implement
//IDbConnection, and in your case its just T.
//if(type==DatabaseTye.Oracle)
//{
//....
//}
}
public DbDataReader GetData()
{
//get comm object from S conn
using(var conn = new S())
using (var comm = conn.CreateCommand())
//...
}
好處是您可以將要用於DbConnection
和DbCommand
的類型傳遞給此類,這對於MySQL .net連接器和Oracle連接器將是不同的。 所以你從課外得到某種控制。 您可以看到這個問題和我的答案,以供參考,以獲得基本實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.