SqLiteHelper.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.SQLite;
  7. using System.Data;
  8. namespace OTSCommon
  9. {
  10. /// <summary>
  11. /// SQLite 操作类
  12. /// </summary>
  13. public class SqLiteHelper
  14. {
  15. /// <summary>
  16. /// 数据库连接定义
  17. /// </summary>
  18. private SQLiteConnection dbConnection;
  19. /// <summary>
  20. /// SQL命令定义
  21. /// </summary>
  22. private SQLiteCommand dbCommand;
  23. private SQLiteDataAdapter dataAdapter;
  24. /// <summary>
  25. /// 数据读取定义
  26. /// </summary>
  27. private SQLiteDataReader dataReader;
  28. private DataTable dt;
  29. /// <summary>
  30. /// 创建一个指定名字的数据库
  31. /// </summary>
  32. /// <param name="basename"></param>
  33. public static void CreateNewDatabase(string basename)
  34. {
  35. try
  36. {
  37. SQLiteConnection.CreateFile(basename);
  38. }
  39. catch (Exception)
  40. {
  41. }
  42. }
  43. /// <summary>
  44. /// 删除指定的数据库文件
  45. /// </summary>
  46. /// <param name="basename"></param>
  47. public void DeleteDataBase(string basename)
  48. {
  49. try
  50. {
  51. if (System.IO.File.Exists(basename))
  52. {
  53. System.IO.File.Delete(basename);
  54. }
  55. }
  56. catch (Exception)
  57. {
  58. }
  59. }
  60. /// <summary>
  61. /// 构造函数
  62. /// </summary>
  63. /// <param name="connectionString">连接SQLite库字符串</param>
  64. public SqLiteHelper(string connectionString)
  65. {
  66. try
  67. {
  68. dbConnection = new SQLiteConnection(connectionString);
  69. dbConnection.Open();
  70. dbCommand = new SQLiteCommand();
  71. dbCommand.Connection = dbConnection;
  72. }
  73. catch (Exception)
  74. {
  75. //Log(e.ToString());
  76. }
  77. }
  78. /// <summary>
  79. /// 执行SQL命令返回DataTable
  80. /// </summary>
  81. /// <returns>The query.</returns>
  82. /// <param name="queryString">SQL命令字符串</param>
  83. public DataTable ExecuteQuery(string queryString)
  84. {
  85. try
  86. {
  87. dataAdapter = new SQLiteDataAdapter(queryString, dbConnection);
  88. DataSet ds= new DataSet();
  89. dataAdapter.Fill(ds);
  90. dt = ds.Tables[0];
  91. }
  92. catch /*(Exception e)*/
  93. {
  94. //Log(e.Message);
  95. }
  96. return dt;
  97. }
  98. public int ExecuteQueryResult(string queryString)
  99. {
  100. int result = -1;
  101. try
  102. {
  103. //dbCommand = dbConnection.CreateCommand();
  104. dbCommand.CommandText = queryString;
  105. result = dbCommand.ExecuteNonQuery();
  106. }
  107. catch /*(Exception e)*/
  108. {
  109. //Log(e.Message);
  110. }
  111. return result;
  112. }
  113. public int ExecuteQueryResult(string queryString,SQLiteTransaction tr)
  114. {
  115. int result = -1;
  116. try
  117. {
  118. //dbCommand = dbConnection.CreateCommand();
  119. dbCommand.CommandText = queryString;
  120. dbCommand.Transaction = tr;
  121. result = dbCommand.ExecuteNonQuery();
  122. }
  123. catch /*(Exception e)*/
  124. {
  125. //Log(e.Message);
  126. }
  127. return result;
  128. }
  129. /// <summary>
  130. /// 关闭数据库连接
  131. /// </summary>
  132. public void CloseConnection()
  133. {
  134. //销毁Commend
  135. if (dbCommand != null)
  136. {
  137. dbCommand.Cancel();
  138. }
  139. dbCommand = null;
  140. //销毁Reader
  141. if (dataReader != null)
  142. {
  143. dataReader.Close();
  144. }
  145. dataReader = null;
  146. //销毁Connection
  147. if (dbConnection != null)
  148. {
  149. dbConnection.Close();
  150. }
  151. dbConnection = null;
  152. }
  153. /// <summary>
  154. /// 读取整张数据表
  155. /// </summary>
  156. /// <returns>The full table.</returns>
  157. /// <param name="tableName">数据表名称</param>
  158. public DataTable ReadFullTable(string tableName)
  159. {
  160. string queryString = "SELECT * FROM " + tableName;
  161. return ExecuteQuery(queryString);
  162. }
  163. /// <summary>
  164. /// 向指定数据表中插入数据
  165. /// </summary>
  166. /// <returns>The values.</returns>
  167. /// <param name="tableName">数据表名称</param>
  168. /// <param name="values">插入的数值</param>
  169. public DataTable InsertValues(string tableName, string[] values)
  170. {
  171. //获取数据表中字段数目
  172. int fieldCount = ReadFullTable(tableName).Columns.Count;
  173. //当插入的数据长度不等于字段数目时引发异常
  174. if (values.Length != fieldCount)
  175. {
  176. throw new SQLiteException("values.Length!=fieldCount");
  177. }
  178. string queryString = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'";
  179. for (int i = 1; i < values.Length; i++)
  180. {
  181. queryString += ", " + "'" + values[i] + "'";
  182. }
  183. queryString += " )";
  184. return ExecuteQuery(queryString);
  185. }
  186. //public void InsertValuesWithBinary()
  187. //{
  188. //}
  189. /// <summary>
  190. /// 更新指定数据表内的数据
  191. /// </summary>
  192. /// <returns>The values.</returns>
  193. /// <param name="tableName">数据表名称</param>
  194. /// <param name="colNames">字段名</param>
  195. /// <param name="colValues">字段名对应的数据</param>
  196. /// <param name="key">关键字</param>
  197. /// <param name="value">关键字对应的值</param>
  198. /// <param name="operation">运算符:=,<,>,...,默认“=”</param>
  199. public DataTable UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string value, string operation = "=")
  200. {
  201. //当字段名称和字段数值不对应时引发异常
  202. if (colNames.Length != colValues.Length)
  203. {
  204. throw new SQLiteException("colNames.Length!=colValues.Length");
  205. }
  206. string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'";
  207. for (int i = 1; i < colValues.Length; i++)
  208. {
  209. queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'";
  210. }
  211. queryString += " WHERE " + key + operation + "'" + value + "'";
  212. return ExecuteQuery(queryString);
  213. }
  214. /// <summary>
  215. /// 删除指定数据表内的数据
  216. /// </summary>
  217. /// <returns>The values.</returns>
  218. /// <param name="tableName">数据表名称</param>
  219. /// <param name="colNames">字段名</param>
  220. /// <param name="colValues">字段名对应的数据</param>
  221. public DataTable DeleteValuesOR(string tableName, string[] colNames, string[] colValues, string[] operations)
  222. {
  223. //当字段名称和字段数值不对应时引发异常
  224. if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
  225. {
  226. throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
  227. }
  228. string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
  229. for (int i = 1; i < colValues.Length; i++)
  230. {
  231. queryString += "OR " + colNames[i] + operations[0] + "'" + colValues[i] + "'";
  232. }
  233. return ExecuteQuery(queryString);
  234. }
  235. /// <summary>
  236. /// 删除指定数据表内的数据
  237. /// </summary>
  238. /// <returns>The values.</returns>
  239. /// <param name="tableName">数据表名称</param>
  240. /// <param name="colNames">字段名</param>
  241. /// <param name="colValues">字段名对应的数据</param>
  242. public DataTable DeleteValuesAND(string tableName, string[] colNames, string[] colValues, string[] operations)
  243. {
  244. //当字段名称和字段数值不对应时引发异常
  245. if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
  246. {
  247. throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
  248. }
  249. string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
  250. for (int i = 1; i < colValues.Length; i++)
  251. {
  252. queryString += " AND " + colNames[i] + operations[i] + "'" + colValues[i] + "'";
  253. }
  254. return ExecuteQuery(queryString);
  255. }
  256. /// <summary>
  257. /// 创建数据表
  258. /// </summary> +
  259. /// <returns>The table.</returns>
  260. /// <param name="tableName">数据表名</param>
  261. /// <param name="colNames">字段名</param>
  262. /// <param name="colTypes">字段名类型</param>
  263. public DataTable CreateTable(string tableName, string[] colNames, string[] colTypes)
  264. {
  265. string queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "( " + colNames[0] + " " + colTypes[0];
  266. for (int i = 1; i < colNames.Length; i++)
  267. {
  268. queryString += ", " + colNames[i] + " " + colTypes[i];
  269. }
  270. queryString += " ) ";
  271. return ExecuteQuery(queryString);
  272. }
  273. /// <summary>
  274. /// 删除数据库表
  275. /// </summary>
  276. /// <param name="tableName"></param>
  277. /// <returns></returns>
  278. public DataTable DeleteTable(string tableName)
  279. {
  280. string queryString = "drop table "+ tableName;
  281. return ExecuteQuery(queryString);
  282. }
  283. /// <summary>
  284. /// Reads the table.
  285. /// </summary>
  286. /// <returns>The table.</returns>
  287. /// <param name="tableName">Table name.</param>
  288. /// <param name="items">Items.</param>
  289. /// <param name="colNames">Col names.</param>
  290. /// <param name="operations">Operations.</param>
  291. /// <param name="colValues">Col values.</param>
  292. public DataTable ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues)
  293. {
  294. string queryString = "SELECT " + items[0];
  295. for (int i = 1; i < items.Length; i++)
  296. {
  297. queryString += ", " + items[i];
  298. }
  299. queryString += " FROM " + tableName + " where 1=1";
  300. //+ " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0];
  301. for (int i = 0; i < colNames.Length; i++)
  302. {
  303. queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " ";
  304. }
  305. return ExecuteQuery(queryString);
  306. }
  307. /// <summary>
  308. /// 执行SQL命令,并带有一个BLOB字段对象的参数输入
  309. /// </summary>
  310. /// <param name="queryString"></param>
  311. /// <param name="parmstr"></param>
  312. /// <param name="in_b"></param>
  313. /// <returns></returns>
  314. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b)
  315. {
  316. int iresult = -1;
  317. try
  318. {
  319. //dbCommand = dbConnection.CreateCommand();
  320. dbCommand.CommandText = queryString;
  321. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  322. //dataReader = dbCommand.ExecuteReader();
  323. //or
  324. iresult = dbCommand.ExecuteNonQuery();
  325. }
  326. catch /*(Exception e)*/
  327. {
  328. //Log(e.Message);
  329. }
  330. return iresult;
  331. }
  332. /// <summary>
  333. /// 执行SQL命令,并带有一个BLOB字段对象的参数输入
  334. /// </summary>
  335. /// <param name="queryString"></param>
  336. /// <param name="parmstr"></param>
  337. /// <param name="in_b"></param>
  338. /// <returns></returns>
  339. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b,SQLiteTransaction tr)
  340. {
  341. int iresult = -1;
  342. try
  343. {
  344. //dbCommand = dbConnection.CreateCommand();
  345. dbCommand.CommandText = queryString;
  346. dbCommand.Transaction = tr;
  347. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  348. //dataReader = dbCommand.ExecuteReader();
  349. //or
  350. iresult = dbCommand.ExecuteNonQuery();
  351. }
  352. catch /*(Exception e)*/
  353. {
  354. //Log(e.Message);
  355. }
  356. return iresult;
  357. }
  358. /// <summary>
  359. /// 执行SQL命令,并带有两个BLOB字段对象的参数输入
  360. /// </summary>
  361. /// <param name="queryString"></param>
  362. /// <param name="parmstr"></param>
  363. /// <param name="in_b"></param>
  364. /// <param name="in_b2"></param>
  365. /// <returns></returns>
  366. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2)
  367. {
  368. int iresult = -1;
  369. try
  370. {
  371. //dbCommand = dbConnection.CreateCommand();
  372. dbCommand.CommandText = queryString;
  373. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  374. dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
  375. //dataReader = dbCommand.ExecuteReader();
  376. //or
  377. iresult = dbCommand.ExecuteNonQuery();
  378. }
  379. catch /*(Exception e)*/
  380. {
  381. //Log(e.Message);
  382. }
  383. return iresult;
  384. }
  385. /// <summary>
  386. /// 执行SQL命令,并带有两个BLOB字段对象的参数输入
  387. /// </summary>
  388. /// <param name="queryString"></param>
  389. /// <param name="parmstr"></param>
  390. /// <param name="in_b"></param>
  391. /// <param name="in_b2"></param>
  392. /// <returns></returns>
  393. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2,SQLiteTransaction tr)
  394. {
  395. int iresult = -1;
  396. try
  397. {
  398. //dbCommand = dbConnection.CreateCommand();
  399. dbCommand.CommandText = queryString;
  400. dbCommand.Transaction = tr;
  401. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  402. dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
  403. //dataReader = dbCommand.ExecuteReader();
  404. //or
  405. iresult = dbCommand.ExecuteNonQuery();
  406. }
  407. catch /*(Exception e)*/
  408. {
  409. //Log(e.Message);
  410. }
  411. return iresult;
  412. }
  413. /// <summary>
  414. /// 执行SQL命令,并带有三个BLOB字段对象的参数输入
  415. /// </summary>
  416. /// <param name="queryString"></param>
  417. /// <param name="parmstr"></param>
  418. /// <param name="in_b"></param>
  419. /// <param name="in_b2"></param>
  420. /// <returns></returns>
  421. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2,string parmstr3,byte[] in_b3)
  422. {
  423. int iresult = -1;
  424. try
  425. {
  426. //dbCommand = dbConnection.CreateCommand();
  427. dbCommand.CommandText = queryString;
  428. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  429. dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
  430. dbCommand.Parameters.Add(parmstr3, System.Data.DbType.Binary).Value = in_b3;
  431. //dataReader = dbCommand.ExecuteReader();
  432. //or
  433. iresult = dbCommand.ExecuteNonQuery();
  434. }
  435. catch /*(Exception e)*/
  436. {
  437. //Log(e.Message);
  438. }
  439. return iresult;
  440. }
  441. /// <summary>
  442. /// 执行SQL命令,并带有三个BLOB字段对象的参数输入
  443. /// </summary>
  444. /// <param name="queryString"></param>
  445. /// <param name="parmstr"></param>
  446. /// <param name="in_b"></param>
  447. /// <param name="in_b2"></param>
  448. /// <returns></returns>
  449. public int ExecuteQuery(string queryString, string parmstr, byte[] in_b, string parmstr2, byte[] in_b2, string parmstr3, byte[] in_b3, SQLiteTransaction tr)
  450. {
  451. int iresult = -1;
  452. try
  453. {
  454. //dbCommand = dbConnection.CreateCommand();
  455. dbCommand.CommandText = queryString;
  456. dbCommand.Transaction = tr;
  457. dbCommand.Parameters.Add(parmstr, System.Data.DbType.Binary).Value = in_b;
  458. dbCommand.Parameters.Add(parmstr2, System.Data.DbType.Binary).Value = in_b2;
  459. dbCommand.Parameters.Add(parmstr3, System.Data.DbType.Binary).Value = in_b3;
  460. //dataReader = dbCommand.ExecuteReader();
  461. //or
  462. iresult = dbCommand.ExecuteNonQuery();
  463. }
  464. catch /*(Exception e)*/
  465. {
  466. //Log(e.Message);
  467. }
  468. return iresult;
  469. }
  470. /// <summary>
  471. /// 开始事务
  472. /// </summary>
  473. /// <returns></returns>
  474. public SQLiteTransaction BeginTranscation()
  475. {
  476. return dbConnection.BeginTransaction();
  477. }
  478. /// <summary>
  479. /// 提交事务
  480. /// </summary>
  481. /// <param name="tx"></param>
  482. public void TranscationCommit(SQLiteTransaction tr )
  483. {
  484. tr.Commit();
  485. }
  486. /// <summary>
  487. /// 回滚事务
  488. /// </summary>
  489. /// <param name="tx"></param>
  490. public void TranscationRollback(SQLiteTransaction tr)
  491. {
  492. tr.Rollback();
  493. }
  494. ///// <summary>
  495. ///// 执行多条SQL语句,实现数据库事务。
  496. ///// </summary>
  497. ///// <param name="SQLStringList">多条SQL语句</param>
  498. public void ExecuteSqlTran(System.Collections.ArrayList SQLStringList)
  499. {
  500. dbConnection.Open();
  501. SQLiteCommand cmd = new SQLiteCommand();
  502. cmd.Connection = dbConnection;
  503. SQLiteTransaction tx = dbConnection.BeginTransaction();
  504. cmd.Transaction = tx;
  505. try
  506. {
  507. for (int n = 0; n < SQLStringList.Count; n++)
  508. {
  509. string strsql = SQLStringList[n].ToString();
  510. if (strsql.Trim().Length > 1)
  511. {
  512. cmd.CommandText = strsql;
  513. cmd.ExecuteNonQuery();
  514. }
  515. }
  516. tx.Commit();
  517. }
  518. catch (System.Data.SQLite.SQLiteException E)
  519. {
  520. tx.Rollback();
  521. throw new Exception(E.Message);
  522. }
  523. }
  524. }
  525. }