用C#實現的數據庫抽象工廠(三)
以下是在應用時真正要調用到的類:
(6)DbAccess.cs
using System; using System.Data;
namespace DbService { /// <summary> /// DbAccess類,即進行數據庫訪問時需要調用的類 /// </summary> public class DbAccess { /// <summary> /// DbAccess構造函數 /// </summary> public DbAccess() { }
/// <summary> /// 無條件查詢操作,即查詢表中所有記錄 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strColumn">列名組</param> /// <returns>無條件查詢結果</returns> public static DataSet SelectAll(string strTableName, string[] strColumn) { DataSet ds = new DataSet(); Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; IDbDataAdapter concreteDbAdapter = abstractDbFactory.CreateDataAdapter(); try { string strSql = "SELECT "; for(int i = 0; i < strColumn.Length - 1; i++) { strSql += (strColumn[i] + ", "); } strSql += (strColumn[strColumn.Length - 1] + " FROM " + strTableName); concreteDbCommand.CommandText = strSql; concreteDbAdapter.SelectCommand = concreteDbCommand; concreteDbAdapter.Fill(ds); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); ds.Clear(); throw; } finally { concreteDbConn.Close(); } return ds; }
/// <summary> /// 條件查詢操作 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strColumn">列名組</param> /// <param name="strCondition">條件</param> /// <returns>條件查詢結果</returns> public static DataSet Select(string strTableName, string[] strColumn, string strCondition) { DataSet ds = new DataSet(); Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; IDbDataAdapter concreteDbAdapter = abstractDbFactory.CreateDataAdapter(); try { string strSql = "SELECT "; for(int i = 0; i < strColumn.Length - 1; i++) { strSql += (strColumn[i] + ", "); } strSql += (strColumn[strColumn.Length - 1] + " FROM " + strTableName + " WHERE " + strCondition); concreteDbCommand.CommandText = strSql; concreteDbAdapter.SelectCommand = concreteDbCommand; concreteDbAdapter.Fill(ds); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); ds.Clear(); throw; } finally { concreteDbConn.Close(); } return ds; }
/// <summary> /// 單條記錄的插入操作 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strColumn">列名組</param> /// <param name="strValue">值組</param> public static void Insert(string strTableName, string[] strColumn, object[] strValue) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { string strSql = "INSERT INTO " + strTableName + " ("; for(int i = 0; i < strColumn.Length - 1; i++) { strSql += (strColumn[i] + ", "); } strSql += (strColumn[strColumn.Length - 1] + ") VALUES ('"); for(int i = 0; i < strValue.Length - 1; i++) { strSql += (strValue[i] + "', '"); } strSql += (strValue[strValue.Length - 1] + "')"); concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; } finally { concreteDbConn.Close(); } }
/// <summary> /// 批量記錄的插入操作,即可一次向多張表中插入不同的批量記錄 /// </summary> /// <param name="ds">批量記錄組成的DataSet,DataSet中的各個DataTable名為表名,各DataTable中的DataColumn名為列名</param> public static void InsertSet(ref DataSet ds) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { foreach(DataTable dt in ds.Tables) { foreach(DataRow dr in dt.Rows) { string strSql = "INSERT INTO " + dt.TableName + " ("; for(int i = 0; i < dt.Columns.Count - 1; i++) { strSql += (dt.Columns[i].Caption + ", "); } strSql += (dt.Columns[dt.Columns.Count - 1].Caption + ") VALUES ('"); for(int i = 0; i < dt.Columns.Count - 1; i++) { strSql += (dr[i] + "', '"); } strSql += (dr[dt.Columns.Count - 1] + "')"); concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); } } concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; }
finally { concreteDbConn.Close(); } }
/// <summary> /// 無條件刪除操作,即刪除表中所有記錄 /// </summary> /// <param name="strTableName">表名</param> public static void DeleteAll(string strTableName) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { string strSql = "DELETE FROM " + strTableName; concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; } finally { concreteDbConn.Close(); } }
/// <summary> /// 條件刪除操作 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strCondition">條件</param> public static void Delete(string strTableName, string strCondition) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { string strSql = "DELETE FROM " + strTableName + " WHERE " + strCondition; concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; } finally { concreteDbConn.Close(); } }
/// <summary> /// 無條件更新操作,即更新表中所有記錄 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strColumn">列名組</param> /// <param name="strValue">值組</param> public static void UpdateAll(string strTableName, string[] strColumn, object[] strValue) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { string strSql = "UPDATE " + strTableName + " SET "; for(int i = 0; i < strColumn.Length - 1; i++) { strSql += (strColumn[i] + " = '" + strValue[i] + "', "); } strSql += (strColumn[strColumn.Length - 1] + " = '" + strValue[strValue.Length - 1] + "' "); concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; } finally { concreteDbConn.Close(); } }
/// <summary> /// 條件更新操作 /// </summary> /// <param name="strTableName">表名</param> /// <param name="strColumn">列名組</param> /// <param name="strValue">值組</param> /// <param name="strCondition">條件</param> public static void Update(string strTableName, string[] strColumn, object[] strValue, string strCondition) { Factory factory = Factory.GetInstance(); AbstractDbFactory abstractDbFactory = factory.CreateInstance(); IDbConnection concreteDbConn = abstractDbFactory.CreateConnection(); concreteDbConn.ConnectionString = abstractDbFactory.GetConnectionString(); concreteDbConn.Open(); IDbCommand concreteDbCommand = abstractDbFactory.CreateCommand(); IDbTransaction concreteDbTrans = abstractDbFactory.CreateTransaction(concreteDbConn); concreteDbCommand.Connection = concreteDbConn; concreteDbCommand.Transaction = concreteDbTrans; try { string strSql = "UPDATE " + strTableName + " SET "; for(int i = 0; i < strColumn.Length - 1; i++) { strSql += (strColumn[i] + " = '" + strValue[i] + "', "); } strSql += (strColumn[strColumn.Length - 1] + " = '" + strValue[strValue.Length - 1] + "' " + " WHERE " + strCondition); concreteDbCommand.CommandText = strSql; concreteDbCommand.ExecuteNonQuery(); concreteDbTrans.Commit(); } catch { concreteDbTrans.Rollback(); throw; } finally { concreteDbConn.Close(); } } } }
最后一步,在Web.config中的根結點configuration下增加一些關于數據庫連接字符串的變量:
<appSettings> <add key="DatabaseType" value="SqlServer" /> <add key="SqlServerServer" value="Ricky" /> <add key="SqlServerDatabase" value="test" /> <add key="SqlServerUid" value="sa" /> <add key="SqlServerPwd" value="henhaoba" /> <add key="OleDbProvider" value="Microsoft.jet.oledb.4.0" /> <add key="OleDbDataSource" value="D:\test.mdb" /> <add key="OdbcDriver" value="Microsoft Access Driver (*.mdb)" /> <add key="OdbcDBQ" value="d:\test.mdb" /> </appSettings>
現在一切OK,大家可以通過改變Web.config中的變量來使用不同的數據庫連接方式(SqlServer專用連接、OleDb連接和Odbc連接)連接不同的數據庫,同時整個使用仍通過DbAccess,不受任何影響。歡迎大家批評指正:)
全文完
|