C# SQLiteHelper

public class SQLiteHelper
{
   private static Lazy<SQLiteHelper> _instance = new Lazy<SQLiteHelper>(() => new SQLiteHelper());
   public static SQLiteHelper Instance = _instance.Value;

 private readonly object queryLockObj = new object();
 public string dbPath;
 public SQLiteConnection sqliteConn;
 public string MinuteData = "DbDatas";

 private SQLiteHelper()
 {
     dbPath = System.AppDomain.CurrentDomain.BaseDirectory + "data.db";
 }

 /// <summary>
 /// 創(chuàng)建數(shù)據(jù)庫
 /// </summary>
 /// <param name="DbFilePath"></param>
 public bool CreateDataBaseFile()
 {
     try
     {
         if (!File.Exists(dbPath))
         {
             SQLiteConnection.CreateFile(dbPath);
         }
         sqliteConn = new SQLiteConnection("data source=" + System.AppDomain.CurrentDomain.BaseDirectory + "data.db");
         return true;
     }
     catch (Exception ex)
     {
         throw new Exception("新建數(shù)據(jù)庫文件" + dbPath + "失斞镣恕:" + ex.Message);
     }
 }
 /// <summary>
 /// 判斷表是否存在
 /// </summary>
 /// <param name="tableName"></param>
 /// <returns></returns>
 public bool TableExist(string table)
 {
     if (sqliteConn.State == ConnectionState.Closed) sqliteConn.Open();
     SQLiteCommand mDbCmd = sqliteConn.CreateCommand();
     mDbCmd.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + table + "';";
     int row = Convert.ToInt32(mDbCmd.ExecuteScalar());
     sqliteConn.Close();
     if (0 < row)
     {
         return true;
     }
     else
     {
         return false;
     }
 }
 /// <summary>
 /// 創(chuàng)建表
 /// </summary>
 /// <param name="dbPath">指定數(shù)據(jù)庫文件</param>
 /// <param name="tableName">表名稱</param>
 public void CreateTable(string table, List<string> Columns)
 {
     if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
     string Column = "";
     for (int i = 0; i < Columns.Count; i++)
     {
         Column += Columns[i] + ",";
     }
     Column = Column.Substring(0, Column.Length - 1);
     var cmd = new SQLiteCommand
     {
         Connection = sqliteConn,
         CommandText = " CREATE TABLE " + table + "(" + Column + ")"
     };
     cmd.ExecuteNonQuery();
     sqliteConn.Close();
 }
 /// <summary>
 /// 添加字段
 /// </summary>
 /// <param name="Colms"></param>
 public void CreateColunm(string table, List<string> Colms)
 {
     if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
     SQLiteCommand cmd = new SQLiteCommand();
     var sql = "select sql from sqlite_master where tbl_name='" + table + "' and type='table';";
     cmd.Connection = sqliteConn;
     cmd.CommandText = sql;
     var com = cmd.ExecuteScalar();
     for (var i = 0; i < Colms.Count; i++)
     {
         try
         {
             if (!com.ToString().Contains(Colms[i]))
             {
                 var sql2 = "alter table " + table + " add column " + Colms[i] + ";";
                 cmd.Connection = sqliteConn;
                 cmd.CommandText = sql2;
                 cmd.ExecuteScalar();
             }
         }
         catch (Exception ex)
         {
             Log.Error("新增字段{0}失敗" + ex.Message + Colms[i]);
         }
     }
     sqliteConn.Close();
 }
 /// <summary>
 /// 獲取類的屬性名稱和類型
 /// </summary>
 /// <typeparam name="T">類</typeparam>
 /// <param name="model"></param>
 /// <returns></returns>
 public List<string> GetColumns<T>(T model) where T : class
 {
     List<string> Columns = new List<string>();
     System.Reflection.PropertyInfo[] properties = model.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
     if (properties.Length <= 0)
     {
         throw new Exception("類屬性長度為零");
     }
     foreach (System.Reflection.PropertyInfo item in properties)
     {
         string Name;
         if (item.Name != "ID")
         {
             if (item.PropertyType.ToString().Contains("DateTime") || item.PropertyType.ToString().Contains("String"))
             {
                 Name = item.Name + " " + " varchar(100) default NULL";
             }
             else
             {
                 Name = item.Name + " " + item.PropertyType.ToString().Split('.').Last().Replace("]", "") + "(12, 4) default NULL";
             }
         }
         else
         {
             Name = item.Name + "  integer PRIMARY KEY autoincrement";
         }
         Columns.Add(Name);
     }
     return Columns;
 }
 /// <summary>
 /// 獲取類的屬性名稱和類型
 /// </summary>
 /// <typeparam name="T">類</typeparam>
 /// <param name="model"></param>
 /// <returns></returns>
 public List<string> GetColumns(List<string> cols)
 {
     var Columns = new List<string>
     {
         "ID  integer PRIMARY KEY autoincrement",
         "Dbtime  varchar(100) default NULL",
         "Status integer default 0",
         "SpecMax integer default NULL"
     };
     foreach (string item in cols)
     {
         string Name = item + " decimal(10, 4) default NULL";
         Columns.Add(Name);
     }
     return Columns;
 }

 public string[] GetKeys<T>(T model) where T : class
 {
     System.Reflection.PropertyInfo[] properties = model.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
     if (properties.Length <= 0)
     {
         throw new Exception("類屬性長度為零");
     }
     string[] Columns = new string[properties.Length - 1];
     int con = 0;
     foreach (System.Reflection.PropertyInfo item in properties)
     {
         if (item.Name != "ID")
         {
             Columns[con++] = item.Name;
         }
     }
     return Columns;
 }
 public string AddString(string TableName, string[] keys, string[] values)
 {
     string keys_string = "(" + keys[0];
     string value_string = "('" + values[0] + "'";

     for (int i = 1; i < keys.Length; i++)
     {
         keys_string += "," + keys[i];
     }
     for (int i = 1; i < values.Length; i++)
     {
         value_string += ",'" + values[i] + "'";
     }
     keys_string += ")";
     value_string += ")";
     string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
     return sql;
 }
 public string AddString(string TableName, Dictionary<string, string> keyValues)
 {
     string keys_string = "( ";
     string value_string = "( ";
     int count = 0;
     foreach (var item in keyValues)
     {
         if (count == 0)
         {
             keys_string += item.Key;
             value_string += "'" + item.Value + "'";
             count++;
         }
         else
         {
             keys_string += "," + item.Key;
             value_string += ",'" + item.Value + "'";
         }
     }
     keys_string += ")";
     value_string += ")";
     string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
     return sql;
 }

 public string AddStringReal(string TableName, Dictionary<string, decimal> keyValues)
 {
     string keys_string = "( Dbtime ";
     string value_string = "('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'";
     foreach (var item in keyValues)
     {
         keys_string += "," + item.Key;
         value_string += ",'" + item.Value + "'";
     }
     keys_string += ")";
     value_string += ")";
     string sql = string.Format("INSERT INTO " + TableName + " {0} VALUES {1} ;", keys_string, value_string);
     return sql;
 }

 public int QueryCount(string TableName, string where = "")
 {
     var value = 0;
     try
     {
         lock (queryLockObj)
         {
             using (SQLiteCommand cmd = new SQLiteCommand())
             {
                 if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                 cmd.Connection = sqliteConn;
                 cmd.CommandText = " select count(*) from " + TableName + " " + where;
                 SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                 DataTable dt = new DataTable();
                 da.Fill(dt);
                 sqliteConn.Close();

                 if (int.TryParse(dt.Rows[0][0].ToString(), out var result))
                 {
                     value = result;
                 }
             }
             return value;
         }
     }
     catch (Exception ex)
     {
         Log.Error("查詢出錯(cuò):" + TableName + where + "\r\n" + ex.Message);
     }
     return value;
 }
 public List<T> Query<T>(string TableName, string where = "") where T : new()
 {
     try
     {
         lock (queryLockObj)
         {
             List<T> datas = new List<T>();
             using (SQLiteCommand cmd = new SQLiteCommand())
             {
                 if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                 cmd.Connection = sqliteConn;
                 cmd.CommandText = " select * from " + TableName + " " + where;
                 SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                 DataTable dt = new DataTable();
                 da.Fill(dt);
                 sqliteConn.Close();

                 System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
                 if (properties.Length <= 0)
                 {
                     throw new Exception("類屬性長度為零");
                 }
                 foreach (DataRow dd in dt.Rows)
                 {
                     int i = 0;
                     var model = new T();
                     foreach (System.Reflection.PropertyInfo item in properties)
                     {
                         var value = dd[i++];
                         if (value is DBNull)
                         {
                             var ds = Convert.ChangeType(0, item.PropertyType);
                             item.SetValue(model, ds, null);
                         }
                         else
                         {
                             var ds = Convert.ChangeType(value, item.PropertyType);
                             item.SetValue(model, ds, null);
                         }
                     }
                     datas.Add(model);
                 }
             }
             return datas;
         }
     }
     catch (Exception ex)
     {
         Log.Error("查詢出錯(cuò):" + TableName + where + "\r\n" + ex.Message);
         return new List<T>();
     }
 }
 public List<T> Query<T>(string sql) where T : new()
 {
     try
     {
         lock (queryLockObj)
         {
             List<T> datas = new List<T>();
             using (SQLiteCommand cmd = new SQLiteCommand())
             {
                 if (sqliteConn.State != System.Data.ConnectionState.Open) sqliteConn.Open();
                 cmd.Connection = sqliteConn;
                 cmd.CommandText = sql;
                 SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                 DataTable dt = new DataTable();
                 da.Fill(dt);
                 sqliteConn.Close();

                 System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
                 if (properties.Length <= 0)
                 {
                     throw new Exception("類屬性長度為零");
                 }
                 foreach (DataRow dd in dt.Rows)
                 {
                     int i = 0;
                     var model = new T();
                     foreach (System.Reflection.PropertyInfo item in properties)
                     {
                         var value = dd[i++];
                         if (value is DBNull)
                         {
                             var ds = Convert.ChangeType(0, item.PropertyType);
                             item.SetValue(model, ds, null);
                         }
                         else
                         {
                             var ds = Convert.ChangeType(value, item.PropertyType);
                             item.SetValue(model, ds, null);
                         }
                     }
                     datas.Add(model);
                 }
             }
             return datas;
         }
     }
     catch (Exception ex)
     {
         Log.Error("查詢出錯(cuò):" + sql + "\r\n" + ex.Message);
         return new List<T>();
     }
 }

 private readonly object LockObj = new object();
 public bool SqliteDbTransaction(string sqlString)
 {
     lock (LockObj)
     {
         if (sqliteConn.State == ConnectionState.Closed) sqliteConn.Open();
         DbTransaction trans = sqliteConn.BeginTransaction();
         try
         {
             using (SQLiteCommand cmd = new SQLiteCommand(sqliteConn))
             {
                 int rows = 0;
                 cmd.CommandText = sqlString;
                 rows = cmd.ExecuteNonQuery();
                 trans.Commit();//提交事務(wù)
                 sqliteConn.Close();
                 return rows > 0;
             }
         }
         catch (Exception ex)
         {
             trans.Rollback();//回滾事務(wù)
             sqliteConn.Close();
             Log.Error("提交數(shù)據(jù)庫失敗" + ex.Message);
             return false;
         }
     }
 }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辉川,一起剝皮案震驚了整個(gè)濱河市良哲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌割坠,老刑警劉巖礁凡,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孽亲,居然都是意外死亡坎穿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門返劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玲昧,“玉大人,你說我怎么就攤上這事篮绿》跹樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵亲配,是天一觀的道長尘应。 經(jīng)常有香客問我,道長弃榨,這世上最難降的妖魔是什么菩收? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鲸睛,結(jié)果婚禮上娜饵,老公的妹妹穿的比我還像新娘。我一直安慰自己官辈,他們只是感情好箱舞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拳亿,像睡著了一般晴股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肺魁,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天电湘,我揣著相機(jī)與錄音,去河邊找鬼。 笑死寂呛,一個(gè)胖子當(dāng)著我的面吹牛怎诫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贷痪,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幻妓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劫拢?” 一聲冷哼從身側(cè)響起肉津,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舱沧,沒想到半個(gè)月后妹沙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狗唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年初烘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涡真。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片分俯。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哆料,靈堂內(nèi)的尸體忽然破棺而出缸剪,到底是詐尸還是另有隱情,我是刑警寧澤东亦,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布杏节,位于F島的核電站,受9級特大地震影響典阵,放射性物質(zhì)發(fā)生泄漏奋渔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一壮啊、第九天 我趴在偏房一處隱蔽的房頂上張望嫉鲸。 院中可真熱鬧,春花似錦歹啼、人聲如沸玄渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藤树。三九已至,卻和暖如春拓萌,著一層夾襖步出監(jiān)牢的瞬間岁钓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屡限,地道東北人降宅。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像囚霸,于是被迫代替她去往敵國和親腰根。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容