IDBC

IDBC,全稱是indoor DistributedNode BSystem,即數字式室內覆蓋分布系統 。

IDBC

IDBC:indoor DistributedNode BSystem--數字式室內覆蓋分布系統

.相關知識

繼承IDbConnection連線不同資料庫

本方案可實現僅修改app.config即可連線不同資料庫,但是設計資料庫時需要注意各種資料庫的數據類型是不一樣的。

各種不同資料庫的Connection、Command、DataAdapter、Transaction和parameter都繼承自IDbConnection、IDbCommand、IDbDataAdapter、IDbTransaction和IDbDataParameter,用一個工廠來實現接口的實例即可實現連線不同資料庫。

首先,需要新建一個類庫,命名為DbManager,此類庫需要5個檔案,

1、創建一個枚舉類型:DataProvider.cs

namespaceDbManager

{

publicenumDataProvider
{
Oracle,
SqlServer,
OleDb,
Odbc,
MySql
}
}

2、創建一個工廠類,用來產生以上不同資料庫的實例:DBManagerFactory.cs

usingSystem.Data;
usingSystem.Data.Odbc;
usingSystem.Data.SqlClient;
usingSystem.Data.OleDb;
usingSystem.Data.OracleClient;//需要添加引用
usingMySql.Data.MySqlClient;//請自行安裝MySQLConnector/Net後添加引用

namespaceDbManager
{
publicsealedclassDBManagerFactory
{
privateDBManagerFactory()
{
}

publicstaticIDbConnectionGetConnection(DataProviderproviderType)
{
IDbConnectioniDbConnection;
switch(providerType)
{
caseDataProvider.SqlServer:
iDbConnection=newSqlConnection();
break;
caseDataProvider.OleDb:
iDbConnection=newOleDbConnection();
break;
caseDataProvider.Odbc:
iDbConnection=newOdbcConnection();
break;
caseDataProvider.Oracle:
iDbConnection=newOracleConnection();
break;
caseDataProvider.MySql:
iDbConnection=newMySqlConnection();
break;
default:
returnnull;
}
returniDbConnection;
}

publicstaticIDbCommandGetCommand(DataProviderproviderType)
{
switch(providerType)
{
caseDataProvider.SqlServer:
returnnewSqlCommand();
caseDataProvider.OleDb:
returnnewOleDbCommand();
caseDataProvider.Odbc:
returnnewOdbcCommand();
caseDataProvider.Oracle:
returnnewOracleCommand();
caseDataProvider.MySql:
returnnewMySqlCommand();
default:
returnnull;
}
}

publicstaticIDbDataAdapterGetDataAdapter(DataProviderproviderType)
{
switch(providerType)
{
caseDataProvider.SqlServer:
returnnewSqlDataAdapter();
caseDataProvider.OleDb:
returnnewOleDbDataAdapter();
caseDataProvider.Odbc:
returnnewOdbcDataAdapter();
caseDataProvider.Oracle:
returnnewOracleDataAdapter();
caseDataProvider.MySql:
returnnewMySqlDataAdapter();
default:
returnnull;
}
}

publicstaticIDbTransactionGetTransaction(DataProviderproviderType)
{
IDbConnectioniDbConnection=GetConnection(providerType);
IDbTransactioniDbTransaction=iDbConnection.BeginTransaction();
returniDbTransaction;
}

publicstaticIDbDataParameter[]GetParameters(DataProviderproviderType,intparamsCount)
{
IDbDataParameter[]idbParams=newIDbDataParameter[paramsCount];
switch(providerType)
{
caseDataProvider.SqlServer:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newSqlParameter();
}
break;
caseDataProvider.OleDb:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOleDbParameter();
}
break;
caseDataProvider.Odbc:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOdbcParameter();
}
break;
caseDataProvider.Oracle:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOracleParameter();
}
break;
caseDataProvider.MySql:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newMySqlParameter();
}
break;
default:
idbParams=null;
break;
}
returnidbParams;
}
}
}
3、創建一個接口:IDBManager.cs

usingSystem.Data;

namespaceDbManager
{
publicinterfaceIDBManager
{
DataProviderProviderType
{
get;
set;
}

IDbConnectionConnection
{
get;
set;
}

IDataReaderDataReader
{
get;
set;
}

IDbCommandCommand
{
get;
set;
}

IDbTransactionTransaction
{
get;
set;
}

IDbDataParameter[]Parameters
{
get;
set;
}

stringConnectionString
{
get;
set;
}

voidOpen();
voidClose();
voidDispose();
voidCreateParameters(intparamsCount);
voidAddParameters(intindex,stringparamName,objectobjValue);
voidBeginTransaction();
voidCommitTransaction();
voidCloseReader();
IDataReaderExecuteReader(CommandTypecommandType,stringcommandText);
intExecuteNonQuery(CommandTypecommandType,stringcommandText);
objectExecuteScalar(CommandTypecommandType,stringcommandText);
DataSetExecuteDataSet(CommandTypecommandType,stringcommandText);
}
}
4、創建一個類來實現IDBManager接口:DBManager.cs

usingSystem;
usingSystem.Data;

namespaceDbManager
{
publicsealedclassDBManager:IDBManager,IDisposable
{
#region欄位

privateDataProvider_providerType;
privateIDbConnection_idbConnection;
privateIDataReader_iDataReader;
privateIDbCommand_idbCommand;
privateIDbTransaction_idbTransaction;
privateIDbDataParameter[]_idbParameters;
privatestring_connectionString;

#endregion

#region構造方法

publicDBManager()
{
}

publicDBManager(DataProviderproviderType)
{
ProviderType=providerType;
}

publicDBManager(DataProviderproviderType,stringconnectionString)
{
ProviderType=providerType;
ConnectionString=connectionString;
}

#endregion

#region屬性

publicDataProviderProviderType
{
get{return_providerType;}
set{_providerType=value;}
}

publicIDbConnectionConnection
{
get{return_idbConnection;}
set{_idbConnection=value;}
}

publicIDataReaderDataReader
{
get{return_iDataReader;}
set{_iDataReader=value;}
}

publicIDbCommandCommand
{
get{return_idbCommand;}
set{_idbCommand=value;}
}

publicIDbTransactionTransaction
{
get{return_idbTransaction;}
set{_idbTransaction=value;}
}

publicIDbDataParameter[]Parameters
{
get{return_idbParameters;}
set{_idbParameters=value;}
}

publicstringConnectionString
{
get{return_connectionString;}
set{_connectionString=value;}
}

#endregion

#region公有方法

publicvoidOpen()
{
Connection=DBManagerFactory.GetConnection(ProviderType);
Connection.ConnectionString=ConnectionString;
if(Connection.State!=ConnectionState.Open)
{
Connection.Open();
}
Command=DBManagerFactory.GetCommand(ProviderType);
}

publicvoidClose()
{
if(Connection.State!=ConnectionState.Closed)
{
Connection.Close();
}
}

publicvoidDispose()
{
GC.SuppressFinalize(this);
Close();
Command=null;
Transaction=null;
Connection=null;
}

publicvoidCreateParameters(intparamsCount)
{
Parameters=newIDbDataParameter[paramsCount];
Parameters=DBManagerFactory.GetParameters(ProviderType,paramsCount);
}

publicvoidAddParameters(intindex,stringparamName,objectobjValue)
{
if(index<Parameters.Length)
{
Parameters[index].ParameterName=paramName;
Parameters[index].Value=objValue;
}
}

publicvoidBeginTransaction()
{
if(Transaction==null)
{
Transaction=DBManagerFactory.GetTransaction(ProviderType);
}
Command.Transaction=Transaction;
}

publicvoidCommitTransaction()
{
if(Transaction!=null)
{
Transaction.Commit();
}
Transaction=null;
}

publicvoidCloseReader()
{
if(DataReader!=null)
{
DataReader.Close();
}
}

publicIDataReaderExecuteReader(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
Command.Connection=Connection;
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
DataReader=Command.ExecuteReader();
Command.Parameters.Clear();
returnDataReader;
}

publicintExecuteNonQuery(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
intreturnValue=Command.ExecuteNonQuery();
Command.Parameters.Clear();
returnreturnValue;
}

publicobjectExecuteScalar(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
objectreturnValue=Command.ExecuteScalar();
Command.Parameters.Clear();
returnreturnValue;
}

publicDataSetExecuteDataSet(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
IDbDataAdapterdataAdapter=DBManagerFactory.GetDataAdapter(ProviderType);
dataAdapter.SelectCommand=Command;
DataSetdataSet=newDataSet();
dataAdapter.Fill(dataSet);
Command.Parameters.Clear();
returndataSet;
}

#endregion

#region私有方法

privatevoidAttachParameters(IDbCommandcommand,IDbDataParameter[]commandParameters)
{
foreach(IDbDataParameteridbParameterincommandParameters)
{
if(idbParameter.Direction==ParameterDirection.InputOutput&&idbParameter.Value==null)
{
idbParameter.Value=DBNull.Value;
}
command.Parameters.Add(idbParameter);
}
}

privatevoidPrepareCommand(IDbCommandcommand,IDbConnectionconnection,IDbTransactiontransaction,
CommandTypecommandType,stringcommandText,IDbDataParameter[]commandParameters)
{
command.Connection=connection;
command.CommandText=commandText;
command.CommandType=commandType;
if(transaction!=null)
{
command.Transaction=transaction;
}
if(commandParameters!=null)
{
AttachParameters(command,commandParameters);
}
}

#endregion
}
}
5、再加一個dbhelper.cs,來調用DBManager類,外部來直接調用DBHelper類即可。

usingSystem;
usingSystem.Data;
usingSystem.Configuration;

namespaceDbManager
{
publicclassDBHelper
{
privatestaticreadonlyIDBManagerdbManager=newDBManager(GetDataProvider(),GetConnectionString());

///<summary>
///從配置檔案中選擇資料庫類型
///</summary>
///<returns>DataProvider枚舉值</returns>
privatestaticDataProviderGetDataProvider()
{
stringproviderType=ConfigurationManager.AppSettings["DataProvider"];
DataProviderdataProvider;
switch(providerType)
{
case"Oracle":
dataProvider=DataProvider.Oracle;
break;
case"SqlServer":
dataProvider=DataProvider.SqlServer;
break;
case"OleDb":
dataProvider=DataProvider.OleDb;
break;
case"Odbc":
dataProvider=DataProvider.Odbc;
break;
case"MySql":
dataProvider=DataProvider.MySql;
break;
default:
returnDataProvider.Odbc;
}
returndataProvider;
}

///<summary>
///從配置檔案獲取連線字元串
///</summary>
///<returns>連線字元串</returns>
privatestaticstringGetConnectionString()
{
returnConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
}

///<summary>
///關閉資料庫連線的方法
///</summary>
publicstaticvoidClose()
{
dbManager.Dispose();
}

///<summary>
///創建參數
///</summary>
///<paramname="paramsCount">參數個數</param>
publicstaticvoidCreateParameters(intparamsCount)
{
dbManager.CreateParameters(paramsCount);
}

///<summary>
///添加參數
///</summary>
///<paramname="index">參數索引</param>
///<paramname="paramName">參數名</param>
///<paramname="objValue">參數值</param>
publicstaticvoidAddParameters(intindex,stringparamName,objectobjValue)
{
dbManager.AddParameters(index,paramName,objValue);
}

///<summary>
///執行增刪改
///</summary>
///<paramname="sqlString">安全的sql語句string.Format()</param>
///<returns>操作成功返回true</returns>
publicstaticboolExecuteNonQuery(stringsqlString)
{
try
{
dbManager.Open();
returndbManager.ExecuteNonQuery(CommandType.Text,sqlString)>0?true:false;
}
catch(Exceptione)
{
thrownewException(e.Message);
}
finally
{
dbManager.Dispose();
}
}

///<summary>
///執行查詢
///</summary>
///<paramname="sqlString">安全的sql語句string.Format()</param>
///<returns>返回IDataReader</returns>
publicstaticIDataReaderExecuteReader(stringsqlString)
{
try
{
dbManager.Open();
returndbManager.ExecuteReader(CommandType.Text,sqlString);
}
catch(Exceptione)
{
thrownewException(e.Message);
}
}
}
}

現在,將上述項目生成一個DbManager.dll類庫,在具體的DAL層裡面就可以直接調用了。

DBHelper類沒有全部寫完,只寫了ExecuteNonQuery()和ExecuteReader()兩個方法,對於有參和無參的增刪改查操作暫時夠用,返回DataSet的方法未寫,Transaction相關的也未寫。

6、app.config

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<connectionStrings>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=root;pwd=mysqladmin"/>
<!--通過改變ConnectionString的值來更換資料庫連線字元串
<addname="ConnString"connectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=DBDemo.mdb;JetOLEDB:DatabasePassword=1234"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;IntegratedSecurity=SSPI"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=sa;pwd=1234"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=root;pwd=mysqladmin"/>
-->
</connectionStrings>
<appSettings>
<addkey="DataProvider"value="MySql"/>
<!--通過改變value值來更換資料庫
<addkey="DataProvider"value="Oracle"/>
<addkey="DataProvider"value="SqlServer"/>
<addkey="DataProvider"value="OleDb"/>
<addkey="DataProvider"value="Odbc"/>
<addkey="DataProvider"value="MySql"/>
-->
</appSettings>
</configuration>
7、程式中的調用

舉個簡單的例子,我們就創建一個控制台應用程式,然後添加DbManager.dll的引用

Program.cs檔案的樣子:

usingSystem;
usingSystem.Data;
usingDbManager;//記得引入命名空間

namespaceDBDemo
{
classProgram
{
staticvoidMain(string[]args)
{
SelectWithoutParams();
Console.WriteLine("------安全sql語句string.Format()的查詢結果------");
SelectWithSafeSql(4);
Console.WriteLine("------參數化語句的查詢結果-------");
SelectWithParams("總統套間");

}

privatestaticvoidSelectWithoutParams()

{
conststringsql="select*fromRoomType";
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();//記得關閉reader
}

privatestaticvoidSelectWithSafeSql(intTypeId)
{
stringsql=string.Format("select*fromRoomTypewhereTypeId={0}",TypeId);
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();
}

privatestaticvoidSelectWithParams(stringtypeName)
{

stringsql="select*fromRoomTypewhereTypeName=@TypeName";

//先創建參數,然後才能添加參數

DBHelper.CreateParameters(1);//參數個數,1個
DBHelper.AddParameters(0,"@TypeName",typeName);
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();
}
}
}

OK!全部完成!在具體的DAL層中,調用DBHelper的相關方法即可,如果是查詢方法,記得最後要寫關閉代碼。只要表結構一樣,可以在app.config中隨意切換資料庫。

最後注意的是:

各個資料庫的插入語句不一樣,假設我們有4個欄位,第一個欄位fieldName1為自增欄位。

對於SQLServer,不需要寫自增欄位,

語句是:INSERTINTOtableVALUES(value2,value3,value4);

對於MySQL,自增欄位位置需要寫null代替,

語句是:INSERTINTOtableVALUES(NULL,value2,value3,value4);

而對於ACCESS資料庫,則必須寫完整

語句是:INSERTINTOtable(fieldName2,fieldName3,fieldName4)VALUES(value2,value3,value4);

為了實現兼容,大家還是都按完整的來寫,就不會有錯了。

本方案可實現僅修改app.config即可連線不同資料庫,但是設計資料庫時需要注意各種資料庫的數據類型是不一樣的。

各種不同資料庫的Connection、Command、DataAdapter、Transaction和Parameter都繼承自IDbConnection、IDbCommand、IDbDataAdapter、IDbTransaction和IDbDataParameter,用一個工廠來實現接口的實例即可實現連線不同資料庫。

首先,需要新建一個類庫,命名為DbManager,此類庫需要5個檔案,

1、創建一個枚舉類型:DataProvider.cs

namespaceDbManager

{

publicenumDataProvider
{
Oracle,
SqlServer,
OleDb,
Odbc,
MySql
}
}

2、創建一個工廠類,用來產生以上不同資料庫的實例:DBManagerFactory.cs

usingSystem.Data;
usingSystem.Data.Odbc;
usingSystem.Data.SqlClient;
usingSystem.Data.OleDb;
usingSystem.Data.OracleClient;//需要添加引用
usingMySql.Data.MySqlClient;//請自行安裝MySQLConnector/Net後添加引用

namespaceDbManager
{
publicsealedclassDBManagerFactory
{
privateDBManagerFactory()
{
}

publicstaticIDbConnectionGetConnection(DataProviderproviderType)
{
IDbConnectioniDbConnection;
switch(providerType)
{
caseDataProvider.SqlServer:
iDbConnection=newSqlConnection();
break;
caseDataProvider.OleDb:
iDbConnection=newOleDbConnection();
break;
caseDataProvider.Odbc:
iDbConnection=newOdbcConnection();
break;
caseDataProvider.Oracle:
iDbConnection=newOracleConnection();
break;
caseDataProvider.MySql:
iDbConnection=newMySqlConnection();
break;
default:
returnnull;
}
returniDbConnection;
}

publicstaticIDbCommandGetCommand(DataProviderproviderType)
{
switch(providerType)
{
caseDataProvider.SqlServer:
returnnewSqlCommand();
caseDataProvider.OleDb:
returnnewOleDbCommand();
caseDataProvider.Odbc:
returnnewOdbcCommand();
caseDataProvider.Oracle:
returnnewOracleCommand();
caseDataProvider.MySql:
returnnewMySqlCommand();
default:
returnnull;
}
}

publicstaticIDbDataAdapterGetDataAdapter(DataProviderproviderType)
{
switch(providerType)
{
caseDataProvider.SqlServer:
returnnewSqlDataAdapter();
caseDataProvider.OleDb:
returnnewOleDbDataAdapter();
caseDataProvider.Odbc:
returnnewOdbcDataAdapter();
caseDataProvider.Oracle:
returnnewOracleDataAdapter();
caseDataProvider.MySql:
returnnewMySqlDataAdapter();
default:
returnnull;
}
}

publicstaticIDbTransactionGetTransaction(DataProviderproviderType)
{
IDbConnectioniDbConnection=GetConnection(providerType);
IDbTransactioniDbTransaction=iDbConnection.BeginTransaction();
returniDbTransaction;
}

publicstaticIDbDataParameter[]GetParameters(DataProviderproviderType,intparamsCount)
{
IDbDataParameter[]idbParams=newIDbDataParameter[paramsCount];
switch(providerType)
{
caseDataProvider.SqlServer:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newSqlParameter();
}
break;
caseDataProvider.OleDb:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOleDbParameter();
}
break;
caseDataProvider.Odbc:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOdbcParameter();
}
break;
caseDataProvider.Oracle:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newOracleParameter();
}
break;
caseDataProvider.MySql:
for(inti=0;i<paramsCount;i++)
{
idbParams[i]=newMySqlParameter();
}
break;
default:
idbParams=null;
break;
}
returnidbParams;
}
}
}
3、創建一個接口:IDBManager.cs

usingSystem.Data;

namespaceDbManager
{
publicinterfaceIDBManager
{
DataProviderProviderType
{
get;
set;
}

IDbConnectionConnection
{
get;
set;
}

IDataReaderDataReader
{
get;
set;
}

IDbCommandCommand
{
get;
set;
}

IDbTransactionTransaction
{
get;
set;
}

IDbDataParameter[]Parameters
{
get;
set;
}

stringConnectionString
{
get;
set;
}

voidOpen();
voidClose();
voidDispose();
voidCreateParameters(intparamsCount);
voidAddParameters(intindex,stringparamName,objectobjValue);
voidBeginTransaction();
voidCommitTransaction();
voidCloseReader();
IDataReaderExecuteReader(CommandTypecommandType,stringcommandText);
intExecuteNonQuery(CommandTypecommandType,stringcommandText);
objectExecuteScalar(CommandTypecommandType,stringcommandText);
DataSetExecuteDataSet(CommandTypecommandType,stringcommandText);
}
}
4、創建一個類來實現IDBManager接口:DBManager.cs

usingSystem;
usingSystem.Data;

namespaceDbManager
{
publicsealedclassDBManager:IDBManager,IDisposable
{
#region欄位

privateDataProvider_providerType;
privateIDbConnection_idbConnection;
privateIDataReader_iDataReader;
privateIDbCommand_idbCommand;
privateIDbTransaction_idbTransaction;
privateIDbDataParameter[]_idbParameters;
privatestring_connectionString;

#endregion

#region構造方法

publicDBManager()
{
}

publicDBManager(DataProviderproviderType)
{
ProviderType=providerType;
}

publicDBManager(DataProviderproviderType,stringconnectionString)
{
ProviderType=providerType;
ConnectionString=connectionString;
}

#endregion

#region屬性

publicDataProviderProviderType
{
get{return_providerType;}
set{_providerType=value;}
}

publicIDbConnectionConnection
{
get{return_idbConnection;}
set{_idbConnection=value;}
}

publicIDataReaderDataReader
{
get{return_iDataReader;}
set{_iDataReader=value;}
}

publicIDbCommandCommand
{
get{return_idbCommand;}
set{_idbCommand=value;}
}

publicIDbTransactionTransaction
{
get{return_idbTransaction;}
set{_idbTransaction=value;}
}

publicIDbDataParameter[]Parameters
{
get{return_idbParameters;}
set{_idbParameters=value;}
}

publicstringConnectionString
{
get{return_connectionString;}
set{_connectionString=value;}
}

#endregion

#region公有方法

publicvoidOpen()
{
Connection=DBManagerFactory.GetConnection(ProviderType);
Connection.ConnectionString=ConnectionString;
if(Connection.State!=ConnectionState.Open)
{
Connection.Open();
}
Command=DBManagerFactory.GetCommand(ProviderType);
}

publicvoidClose()
{
if(Connection.State!=ConnectionState.Closed)
{
Connection.Close();
}
}

publicvoidDispose()
{
GC.SuppressFinalize(this);
Close();
Command=null;
Transaction=null;
Connection=null;
}

publicvoidCreateParameters(intparamsCount)
{
Parameters=newIDbDataParameter[paramsCount];
Parameters=DBManagerFactory.GetParameters(ProviderType,paramsCount);
}

publicvoidAddParameters(intindex,stringparamName,objectobjValue)
{
if(index<Parameters.Length)
{
Parameters[index].ParameterName=paramName;
Parameters[index].Value=objValue;
}
}

publicvoidBeginTransaction()
{
if(Transaction==null)
{
Transaction=DBManagerFactory.GetTransaction(ProviderType);
}
Command.Transaction=Transaction;
}

publicvoidCommitTransaction()
{
if(Transaction!=null)
{
Transaction.Commit();
}
Transaction=null;
}

publicvoidCloseReader()
{
if(DataReader!=null)
{
DataReader.Close();
}
}

publicIDataReaderExecuteReader(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
Command.Connection=Connection;
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
DataReader=Command.ExecuteReader();
Command.Parameters.Clear();
returnDataReader;
}

publicintExecuteNonQuery(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
intreturnValue=Command.ExecuteNonQuery();
Command.Parameters.Clear();
returnreturnValue;
}

publicobjectExecuteScalar(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
objectreturnValue=Command.ExecuteScalar();
Command.Parameters.Clear();
returnreturnValue;
}

publicDataSetExecuteDataSet(CommandTypecommandType,stringcommandText)
{
Command=DBManagerFactory.GetCommand(ProviderType);
PrepareCommand(Command,Connection,Transaction,commandType,commandText,Parameters);
IDbDataAdapterdataAdapter=DBManagerFactory.GetDataAdapter(ProviderType);
dataAdapter.SelectCommand=Command;
DataSetdataSet=newDataSet();
dataAdapter.Fill(dataSet);
Command.Parameters.Clear();
returndataSet;
}

#endregion

#region私有方法

privatevoidAttachParameters(IDbCommandcommand,IDbDataParameter[]commandParameters)
{
foreach(IDbDataParameteridbParameterincommandParameters)
{
if(idbParameter.Direction==ParameterDirection.InputOutput&&idbParameter.Value==null)
{
idbParameter.Value=DBNull.Value;
}
command.Parameters.Add(idbParameter);
}
}

privatevoidPrepareCommand(IDbCommandcommand,IDbConnectionconnection,IDbTransactiontransaction,
CommandTypecommandType,stringcommandText,IDbDataParameter[]commandParameters)
{
command.Connection=connection;
command.CommandText=commandText;
command.CommandType=commandType;
if(transaction!=null)
{
command.Transaction=transaction;
}
if(commandParameters!=null)
{
AttachParameters(command,commandParameters);
}
}

#endregion
}
}
5、再加一個DBHelper.cs,來調用DBManager類,外部來直接調用DBHelper類即可。

usingSystem;
usingSystem.Data;
usingSystem.Configuration;

namespaceDbManager
{
publicclassDBHelper
{
privatestaticreadonlyIDBManagerdbManager=newDBManager(GetDataProvider(),GetConnectionString());

///<summary>
///從配置檔案中選擇資料庫類型
///</summary>
///<returns>DataProvider枚舉值</returns>
privatestaticDataProviderGetDataProvider()
{
stringproviderType=ConfigurationManager.AppSettings["DataProvider"];
DataProviderdataProvider;
switch(providerType)
{
case"Oracle":
dataProvider=DataProvider.Oracle;
break;
case"SqlServer":
dataProvider=DataProvider.SqlServer;
break;
case"OleDb":
dataProvider=DataProvider.OleDb;
break;
case"Odbc":
dataProvider=DataProvider.Odbc;
break;
case"MySql":
dataProvider=DataProvider.MySql;
break;
default:
returnDataProvider.Odbc;
}
returndataProvider;
}

///<summary>
///從配置檔案獲取連線字元串
///</summary>
///<returns>連線字元串</returns>
privatestaticstringGetConnectionString()
{
returnConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
}

///<summary>
///關閉資料庫連線的方法
///</summary>
publicstaticvoidClose()
{
dbManager.Dispose();
}

///<summary>
///創建參數
///</summary>
///<paramname="paramsCount">參數個數</param>
publicstaticvoidCreateParameters(intparamsCount)
{
dbManager.CreateParameters(paramsCount);
}

///<summary>
///添加參數
///</summary>
///<paramname="index">參數索引</param>
///<paramname="paramName">參數名</param>
///<paramname="objValue">參數值</param>
publicstaticvoidAddParameters(intindex,stringparamName,objectobjValue)
{
dbManager.AddParameters(index,paramName,objValue);
}

///<summary>
///執行增刪改
///</summary>
///<paramname="sqlString">安全的sql語句string.Format()</param>
///<returns>操作成功返回true</returns>
publicstaticboolExecuteNonQuery(stringsqlString)
{
try
{
dbManager.Open();
returndbManager.ExecuteNonQuery(CommandType.Text,sqlString)>0?true:false;
}
catch(Exceptione)
{
thrownewException(e.Message);
}
finally
{
dbManager.Dispose();
}
}

///<summary>
///執行查詢
///</summary>
///<paramname="sqlString">安全的sql語句string.Format()</param>
///<returns>返回IDataReader</returns>
publicstaticIDataReaderExecuteReader(stringsqlString)
{
try
{
dbManager.Open();
returndbManager.ExecuteReader(CommandType.Text,sqlString);
}
catch(Exceptione)
{
thrownewException(e.Message);
}
}
}
}

現在,將上述項目生成一個DbManager.dll類庫,在具體的DAL層裡面就可以直接調用了。

DBHelper類沒有全部寫完,只寫了ExecuteNonQuery()和ExecuteReader()兩個方法,對於有參和無參的增刪改查操作暫時夠用,返回DataSet的方法未寫,Transaction相關的也未寫。

6、app.config

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<connectionStrings>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=root;pwd=mysqladmin"/>
<!--通過改變ConnectionString的值來更換資料庫連線字元串
<addname="ConnString"connectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=DBDemo.mdb;JetOLEDB:DatabasePassword=1234"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;IntegratedSecurity=SSPI"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=sa;pwd=1234"/>
<addname="ConnString"connectionString="server=localhost;database=yourDbName;PersistSecurityInfo=False;uid=root;pwd=mysqladmin"/>
-->
</connectionStrings>
<appSettings>
<addkey="DataProvider"value="MySql"/>
<!--通過改變value值來更換資料庫
<addkey="DataProvider"value="Oracle"/>
<addkey="DataProvider"value="SqlServer"/>
<addkey="DataProvider"value="OleDb"/>
<addkey="DataProvider"value="Odbc"/>
<addkey="DataProvider"value="MySql"/>
-->
</appSettings>
</configuration>
7、程式中的調用

舉個簡單的例子,我們就創建一個控制台應用程式,然後添加DbManager.dll的引用

Program.cs檔案的樣子:

usingSystem;
usingSystem.Data;
usingDbManager;//記得引入命名空間

namespaceDBDemo
{
classProgram
{
staticvoidMain(string[]args)
{
SelectWithoutParams();
Console.WriteLine("------安全sql語句string.Format()的查詢結果------");
SelectWithSafeSql(4);
Console.WriteLine("------參數化語句的查詢結果-------");
SelectWithParams("總統套間");

}

privatestaticvoidSelectWithoutParams()

{
conststringsql="select*fromRoomType";
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();//記得關閉reader
}

privatestaticvoidSelectWithSafeSql(intTypeId)
{
stringsql=string.Format("select*fromRoomTypewhereTypeId={0}",TypeId);
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();
}

privatestaticvoidSelectWithParams(stringtypeName)
{

stringsql="select*fromRoomTypewhereTypeName=@TypeName";

//先創建參數,然後才能添加參數

DBHelper.CreateParameters(1);//參數個數,1個
DBHelper.AddParameters(0,"@TypeName",typeName);
IDataReaderreader=DBHelper.ExecuteReader(sql);
while(reader.Read())
{
Console.WriteLine(reader["TypeName"].ToString());
}
DBHelper.Close();
}
}
}

OK!全部完成!在具體的DAL層中,調用DBHelper的相關方法即可,如果是查詢方法,記得最後要寫關閉代碼。只要表結構一樣,可以在app.config中隨意切換資料庫。

最後注意的是:

各個資料庫的插入語句不一樣,假設我們有4個欄位,第一個欄位fieldName1為自增欄位。

對於SQLServer,不需要寫自增欄位,

語句是:INSERTINTOtableVALUES(value2,value3,value4);

對於MySQL,自增欄位位置需要寫null代替,

語句是:INSERTINTOtableVALUES(NULL,value2,value3,value4);

而對於ACCESS資料庫,則必須寫完整,

語句是:INSERTINTOtable(fieldName2,fieldName3,fieldName4)VALUES(value2,value3,value4);

為了實現兼容,大家還是都按完整的來寫,就不會有錯了。

相關詞條

相關搜尋

熱門詞條

聯絡我們