C#_DBHelper(DOT.NET) 多資料庫介面卡
阿新 • • 發佈:2022-03-18
DBHelper是在以前寫的MSSQL和SQLite的SQLHelper基礎上做了資料庫傳參型別適配,內容如下:
1.SQLHelper_MSSQL
2.SQLHelper_SQLite
3.DBHelper主類
using HostControl.Util; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Data.SQLite; namespace HostControl.Uril.DBHelper { /// <summary> /// 指定資料庫類別 /// 目前支援MSSQL、Sqlite /// </summary> public class SqlHelper { /// <summary> /// 資料庫型別 /// </summary> public readonly static DBType dBType = DBType.SQLite; /// <summary> /// SQLite連線語句 /// </summary> public readonly static string SQLiteConStr = ConfigurationManager.ConnectionStrings["SQLiteConStr"].ConnectionString; /* 返回的是受影響的行數 * ExecuteNonQuery()通常情況下為資料庫事務處理的首選,當需要執行插入,刪除,修改等操作時,首選ExecuteNonQuery(),不適用於Selete語句,返回永遠是-1 * ExecuteNonQuery()執行成功返回的是一受影響的行數,對於"Create Table"和"Drop Table"語句,返回值是0, * ExecuteNonQuery()操作資料時,可以不使用DataSet直接更改資料庫中的資料。 */ /// <param name="sql"></param> /// <param name="ps"></param> /// <returns></returns> public static int ExecuteNonQuery(string sql, object ps) { int rcount = 0; switch (dBType) { case DBType.MSSQL: rcount = MSSqlHelper.ExecuteNonQuery(sql, ps == null ? null : ps as SqlParameter[]); break; case DBType.SQLite: SQLiteHelper.Initial(SQLiteConStr); // 初始化資料庫連結字串 rcount = SQLiteHelper.ExecuteNonQuery(sql, ps == null ? null : ps as SQLiteParameter[]); break; default: break; } return rcount; } /* 通用查詢方法 * 為了將資料庫的資料填充到dataset中,則必須先使用adapter物件的方法實現填充,當資料填充完成後 */ public static DataSet SelectDataSet(string sql, object ps) { DataSet dataSet = new DataSet(); switch (dBType) { case DBType.MSSQL: dataSet = MSSqlHelper.SelectDataSet(sql, ps == null ? null : ps as SqlParameter[]); break; case DBType.SQLite: SQLiteHelper.Initial(SQLiteConStr); // 初始化資料庫連結字串 DataSet dataSet1 = SQLiteHelper.SelectDataSet(sql, ps == null ? null : ps as SQLiteParameter[]); if (dataSet1 != null && dataSet1.Tables.Count > 0) { // SQLite特殊資料型別轉化(int64->int32、) dataSet = SQLDataTypeConverse.DataTypeConverse_SQLite(dataSet1); } break; default: break; } return dataSet; } #region 事務 /// <summary> /// 返回的是受影響的行數-事務 /// </summary> /// <param name="sql">多個sql</param> /// <param name="ps">指定型別的引數</param> /// <returns></returns> public static int ExecuteNonQueryTrans(string sql, object ps) { int rcount = 0; switch (dBType) { case DBType.MSSQL: rcount = MSSqlHelper.ExecuteNonQueryTrans(sql, ps == null ? null : ps as SqlParameter[]); break; case DBType.SQLite: // Top 1->Limit1 ;刪除Convert(); SQLiteHelper.Initial(SQLiteConStr); // 初始化資料庫連結字串 rcount = SQLiteHelper.ExecuteNonQueryTrans(sql, ps == null ? null : ps as SQLiteParameter[]); break; default: break; } return rcount; } #endregion } /// <summary> /// 資料庫型別 /// </summary> public enum DBType { MSSQL, SQLite, //MySql, //Oracle } /// <summary> /// 不同資料庫特有型別的轉化(為DataSetToList適配的類) /// 預設為MSSQL,其他資料庫為D2D工具遷移後的資料結構,存在資料型別的差異,所以需要轉化 /// </summary> public class SQLDataTypeConverse { /// <summary> /// 不同資料庫特有型別的轉化(為DataSetToList適配的類)-Sqlite /// 只對第一個DataTable進行校驗 /// </summary> public static DataSet DataTypeConverse_SQLite(DataSet dataSet) { DataSet ds = new DataSet(); DataTable dtOld = dataSet.Tables[0]; DataTable dtNew = new DataTable(); // 克隆表結構 foreach (DataColumn col in dtOld.Columns) { // 特殊型別 string TypeName = col.DataType.FullName; switch (TypeName) { case "System.Int64": // int64->int32 #region 特別列(列名) if (col.ColumnName == "IsCheckI") // 自定義的列的int->bit { DataColumn newColumn_Int64 = new DataColumn(col.ColumnName, typeof(Boolean)); dtNew.Columns.Add(newColumn_Int64); } #endregion else { DataColumn newColumn_Int = new DataColumn(col.ColumnName, typeof(Int32)); dtNew.Columns.Add(newColumn_Int); } //DataColumn newColumn_Int = new DataColumn(col.ColumnName, typeof(Int32)); //dtNew.Columns.Add(newColumn_Int); break; case "System.Byte": // Byte->bool DataColumn newColumn_bool = new DataColumn(col.ColumnName, typeof(Boolean)); dtNew.Columns.Add(newColumn_bool); break; default: DataColumn newColumn_Orther = new DataColumn(col.ColumnName, col.DataType); dtNew.Columns.Add(newColumn_Orther); break; } } for (int dtRowcoun = 0; dtRowcoun < dtOld.Rows.Count; dtRowcoun++) { DataRow dydr = dtNew.NewRow(); dydr.ItemArray = dtOld.Rows[dtRowcoun].ItemArray; dtNew.Rows.Add(dydr); } ds.Tables.Clear(); ds.Tables.Add(dtNew); return ds; } } }
注意sqlite的sql語句如果有常量值ture,它的輸出值為int型別1,不是bit型別,所以我對IsCheckI列進行了型別轉化。
select true AS ISCheckI from table