SQliteHelper.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. using OTSCommon.Model;
  2. using OTSModelSharp.DTLBase;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Data.SQLite;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace OTSModelSharp.DTLBase
  11. {
  12. /// <summary>
  13. /// SQLite 操作类
  14. /// </summary>
  15. public class SQLiteHelper
  16. {
  17. /// <summary>
  18. /// 数据库连接字符串
  19. /// </summary>
  20. private string connectionString;
  21. SQLiteConnection connForTrans;
  22. SQLiteCommand cmdForTrans;
  23. SQLiteTransaction trans;
  24. private NLog.Logger log;
  25. /// <summary>
  26. /// 构造函数
  27. /// </summary>
  28. /// <param name="con">连接SQLite库字符串</param>
  29. public SQLiteHelper(string a_sFileName)
  30. {
  31. log = NLog.LogManager.GetCurrentClassLogger();
  32. connectionString = "data source='" + a_sFileName + "'" + ";Version=3;";
  33. }
  34. /// <summary>
  35. /// 根据数据源、密码、版本号设置连接字符串。
  36. /// </summary>
  37. /// <param name="datasource">数据源。</param>
  38. /// <param name="password">密码。</param>
  39. /// <param name="version">版本号(缺省为3)。</param>
  40. public void SetConnectionString(string datasource, string password, int version = 3)
  41. {
  42. connectionString = string.Format("Data Source={0};Version={1};password={2}",
  43. datasource, version, password);
  44. }
  45. public SQLiteConnection GetDBConnection()
  46. {
  47. SQLiteConnection connection = new SQLiteConnection(connectionString);
  48. connForTrans = connection;
  49. return connection;
  50. }
  51. /// <summary>
  52. /// 创建一个数据库文件。如果存在同名数据库文件,则会覆盖。
  53. /// </summary>
  54. /// <param name="dbName">数据库文件名。为null或空串时不创建。</param>
  55. /// <param name="password">(可选)数据库密码,默认为空。</param>
  56. /// <exception cref="Exception"></exception>
  57. public static void CreateNewDatabase(string dbName)
  58. {
  59. if (!string.IsNullOrEmpty(dbName))
  60. {
  61. try { SQLiteConnection.CreateFile(dbName); }
  62. catch (Exception) { throw; }
  63. }
  64. }
  65. /// <summary>
  66. /// 删除指定的数据库文件
  67. /// </summary>
  68. /// <param name="basename"></param>
  69. public void DeleteDataBase(string basename)
  70. {
  71. try
  72. {
  73. if (System.IO.File.Exists(basename))
  74. {
  75. System.IO.File.Delete(basename);
  76. }
  77. }
  78. catch (Exception)
  79. { throw; }
  80. }
  81. /// <summary>
  82. /// 执行SQL命令
  83. /// </summary>
  84. /// <returns>The query.</returns>
  85. /// <param name="queryString">SQL命令字符串</param>
  86. public DataTable ExecuteQuery(string sql, params SQLiteParameter[] parameters)
  87. {
  88. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  89. {
  90. using (SQLiteCommand command = new SQLiteCommand(sql, connection))
  91. {
  92. if (parameters.Length != 0)
  93. {
  94. command.Parameters.AddRange(parameters);
  95. }
  96. SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
  97. DataTable data = new DataTable();
  98. try { adapter.Fill(data); }
  99. catch (Exception) { throw; }
  100. return data;
  101. }
  102. }
  103. }
  104. /// <summary>
  105. /// 对SQLite数据库执行增删改操作,返回受影响的行数。
  106. /// </summary>
  107. /// <param name="sql">要执行的增删改的SQL语句。</param>
  108. /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。</param>
  109. /// <returns></returns>
  110. /// <exception cref="Exception"></exception>
  111. public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
  112. {
  113. int affectedRows = 0;
  114. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  115. {
  116. using (SQLiteCommand command = new SQLiteCommand(connection))
  117. {
  118. try
  119. {
  120. connection.Open();
  121. command.CommandText = sql;
  122. if (parameters.Length != 0)
  123. {
  124. command.Parameters.AddRange(parameters);
  125. }
  126. affectedRows = command.ExecuteNonQuery();
  127. }
  128. catch (Exception) { throw; }
  129. }
  130. }
  131. return affectedRows;
  132. }
  133. public int ExecuteNonQueryForTransaction(SQLiteCommand command ,string sql, params SQLiteParameter[] parameters)
  134. {
  135. int affectedRows = 0;
  136. command.CommandText = sql;
  137. if (parameters.Length != 0)
  138. {
  139. command.Parameters.AddRange(parameters);
  140. }
  141. affectedRows = command.ExecuteNonQuery();
  142. return affectedRows;
  143. }
  144. /// <summary>
  145. /// 单独修改指定位置的能谱数据
  146. /// </summary>
  147. /// <param name="XrayId"></param>
  148. /// <param name="FieldId"></param>
  149. /// <param name="pBlobData"></param>
  150. /// <returns></returns>
  151. public int ExecuteXrayForTransaction(int XrayId, int FieldId, byte[] pBlobData)
  152. {
  153. int affectedRows = 0;
  154. cmdForTrans.CommandText = "UPDATE XRayData SET XRayData = @XRayData WHERE XrayIndex = " + XrayId + " and FieldId = " + FieldId + "";
  155. cmdForTrans.Parameters.Clear();
  156. cmdForTrans.Parameters.AddWithValue(@"XRayData", pBlobData);
  157. affectedRows = cmdForTrans.ExecuteNonQuery();
  158. return affectedRows;
  159. }
  160. public int ExecuteElementForTransaction(int XrayId, int FieldId, int ElementNum, List<string> nameList, List<double> perList)
  161. {
  162. int affectedRows = 0;
  163. cmdForTrans.CommandText = "DELETE FROM ElementChemistry WHERE XrayId = " + XrayId + " and FieldId = " + FieldId + "";
  164. affectedRows = cmdForTrans.ExecuteNonQuery();
  165. for (int i = 0; i < ElementNum; i++)
  166. {
  167. cmdForTrans.CommandText = "INSERT INTO ElementChemistry(XrayID, FieldID, ElementId, ElementNum, Name, Percentage) VALUES ('" + XrayId + "','" + FieldId + "','" + i + "','" + ElementNum + "','" + nameList[i] + "','" + perList[i] + "')";
  168. affectedRows = cmdForTrans.ExecuteNonQuery();
  169. }
  170. return affectedRows;
  171. }
  172. #region 颗粒分割部分
  173. public int ExecuteNewPartIdForTransaction()
  174. {
  175. DataTable dt = ExecuteQuery("SELECT MAX(XrayId) FROM IncAData");
  176. if (dt.Rows.Count == 0)
  177. {
  178. return 0;
  179. }
  180. return int.Parse(dt.Rows[0][0].ToString());
  181. }
  182. public bool ExecuteSegmentForTransaction(Particle particle1, Particle particle2, int SegmentId)
  183. {
  184. cmdForTrans.CommandText = "DELETE FROM Segment WHERE XRayId = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + "";
  185. if (cmdForTrans.ExecuteNonQuery() == 0)
  186. {
  187. return false;
  188. }
  189. for (int i = 0; i < particle1.SegmentNum; i++)
  190. {
  191. cmdForTrans.CommandText = "INSERT INTO Segment(XrayID, FieldID, SegmentId, SegmentNum, Start, Height, Length, ParticleId) VALUES ('"
  192. + particle1.SegmentList[0].XRayId + "','" + particle1.SegmentList[0].FieldId + "','" + i + "','" + particle1.SegmentList[0].SegmentNum + "','"
  193. + particle1.SegmentList[i].Start + "','" + particle1.SegmentList[i].Height + "','" + particle1.SegmentList[i].Length + "','" + particle1.SegmentList[i].ParticleId + "')";
  194. if (cmdForTrans.ExecuteNonQuery() == 0)
  195. {
  196. return false;
  197. }
  198. }
  199. for (int i = 0; i < particle2.SegmentNum; i++)
  200. {
  201. cmdForTrans.CommandText = "INSERT INTO Segment(XrayID, FieldID, SegmentId, SegmentNum, Start, Height, Length, ParticleId) VALUES ('"
  202. + SegmentId + "','" + particle2.SegmentList[0].FieldId + "','" + i + "','" + particle2.SegmentList[0].SegmentNum + "','"
  203. + particle2.SegmentList[i].Start + "','" + particle2.SegmentList[i].Height + "','" + particle2.SegmentList[i].Length + "','" + SegmentId + "')";
  204. if (cmdForTrans.ExecuteNonQuery() == 0)
  205. {
  206. return false;
  207. }
  208. }
  209. return true;
  210. }
  211. public bool ExecuteXrayForTransaction(Particle particle1, Particle particle2, int SegmentId)
  212. {
  213. //XRayData
  214. cmdForTrans.CommandText = "INSERT INTO XRayData(XrayIndex, FieldId, XrayData) SELECT " + SegmentId + ", FieldId, XrayData FROM XRayData WHERE FieldId = "+ particle1.SegmentList[0].FieldId + " AND XrayIndex = "+ particle1.SegmentList[0].XRayId + "";
  215. if (cmdForTrans.ExecuteNonQuery() == 0)
  216. {
  217. return false;
  218. }
  219. //PosXrayInfo
  220. cmdForTrans.CommandText = "UPDATE PosXrayInfo SET PosX = "+ particle1.PosX + ", PosY = "+ particle1.PosY + " WHERE XrayIndex = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + "";
  221. if (cmdForTrans.ExecuteNonQuery() == 0)
  222. {
  223. return false;
  224. }
  225. cmdForTrans.CommandText = "INSERT INTO PosXrayInfo(XrayIndex, PosX, PosY, FieldId, ParticleId, FeatureId, ElementNum) SELECT " + SegmentId + ", "+ particle2.PosX + ", "+ particle2.PosY + ", FieldId, ParticleId, FeatureId, ElementNum FROM PosXrayInfo WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XrayIndex = " + particle1.SegmentList[0].XRayId + "";
  226. if (cmdForTrans.ExecuteNonQuery() == 0)
  227. {
  228. return false;
  229. }
  230. //ElementChemistry
  231. cmdForTrans.CommandText = "INSERT INTO ElementChemistry(XRayId, FieldId, ElementId, ElementNum, Name, Percentage) SELECT " + SegmentId + ", FieldId, ElementId, ElementNum, Name, Percentage FROM ElementChemistry WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XRayId = " + particle1.SegmentList[0].XRayId + "";
  232. if (cmdForTrans.ExecuteNonQuery() == 0)
  233. {
  234. return false;
  235. }
  236. return true;
  237. }
  238. public bool ExecuteIncAForTransaction(Particle particle1, Particle particle2, int SegmentId)
  239. {
  240. cmdForTrans.CommandText = "UPDATE IncAData SET AveGray = " + particle1.AveGray + ", RectLeft = " + particle1.RectLeft + ", RectTop = " + particle1.RectTop + ", RectWidth = " + particle1.RectWidth + ", RectHeight = " + particle1.RectHeight + ", Area = " + particle1.Area + ", PosX = " + particle1.PosX + ", PosY = " + particle1.PosY + ", DFERET = " + particle1.DFERET + ", SegmentNum = " + particle1.SegmentNum + ", ParticleId = " + particle1.ParticleId + ", DMAX = " + particle1.DMAX + ", DMIN = " + particle1.DMIN + ", DPERP = " + particle1.DPERP + ", PERIMETER = " + particle1.PERIMETER + ", ORIENTATION = " + particle1.ORIENTATION + ", DINSCR = " + particle1.DINSCR + ", DMEAN = " + particle1.DMEAN + ", DELONG = " + particle1.DELONG + " WHERE XrayId = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + "";
  241. if (cmdForTrans.ExecuteNonQuery() == 0)
  242. {
  243. return false;
  244. }
  245. cmdForTrans.CommandText = "INSERT INTO IncAData(FieldId, XrayId, AveGray, RectLeft, RectTop, RectWidth, RectHeight, Area, PosX, PosY, DFERET, SegmentNum, FieldPosX, FieldPosY, ParticleId, DMAX, DMIN, DPERP, PERIMETER, ORIENTATION, DINSCR, DMEAN, DELONG, TypeId, TypeName, TypeColor, SEMPosX, SEMPosY, GroupId, GroupName, GroupColor) SELECT FieldId, " + SegmentId + ", " + particle2.AveGray + ", " + particle2.RectLeft + ", " + particle2.RectTop + ", " + particle2.RectWidth + ", " + particle2.RectHeight + ", " + particle2.Area + ", " + particle2.PosX + ", " + particle2.PosY + ", " + particle2.DFERET + ", " + particle2.SegmentNum + ", FieldPosX, FieldPosY," + SegmentId + ", " + particle2.DMAX + ", " + particle2.DMIN + ", " + particle2.DPERP + ", " + particle2.PERIMETER + ", " + particle2.ORIENTATION + ", " + particle2.DINSCR + ", " + particle2.DMEAN + ", " + particle2.DELONG + ", TypeId, TypeName, TypeColor, SEMPosX, SEMPosY, GroupId, GroupName, GroupColor FROM IncAData WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XrayId = " + particle1.SegmentList[0].XRayId + "";
  246. if (cmdForTrans.ExecuteNonQuery() == 0)
  247. {
  248. return false;
  249. }
  250. return true;
  251. }
  252. #endregion
  253. public bool BeginTransaction()
  254. {
  255. if (connForTrans.State != ConnectionState.Open)
  256. {
  257. connForTrans.Open();
  258. }
  259. trans = connForTrans.BeginTransaction();
  260. cmdForTrans = new SQLiteCommand();
  261. cmdForTrans.Connection = connForTrans;
  262. cmdForTrans.Transaction = trans;
  263. return true;
  264. }
  265. public bool CommitTransaction()
  266. {
  267. trans.Commit();
  268. connForTrans.Close();
  269. return true;
  270. }
  271. /// <summary>
  272. /// 批量处理数据操作语句。
  273. /// </summary>
  274. /// <param name="list">SQL语句集合。</param>
  275. /// <exception cref="Exception"></exception>
  276. public void ExecuteNonQueryBatch(ref List<KeyValuePair<string, SQLiteParameter[]>> list)
  277. {
  278. using (SQLiteConnection conn = new SQLiteConnection(connectionString))
  279. {
  280. try { conn.Open(); }
  281. catch { throw; }
  282. SQLiteCommand cmd1 =conn.CreateCommand();
  283. cmd1.CommandText = "pragma synchronous = 0;";
  284. cmd1.ExecuteNonQuery();
  285. using (SQLiteTransaction tran = conn.BeginTransaction())
  286. {
  287. using (SQLiteCommand cmd = new SQLiteCommand(conn))
  288. {
  289. try
  290. {
  291. foreach (var item in list)
  292. {
  293. cmd.CommandText = item.Key;
  294. if (item.Value != null)
  295. {
  296. cmd.Parameters.AddRange(item.Value);
  297. }
  298. cmd.ExecuteNonQuery();
  299. cmd.Parameters.Clear();
  300. }
  301. tran.Commit();
  302. }
  303. catch (Exception ex)
  304. {
  305. tran.Rollback();
  306. log.Error(ex.ToString());
  307. }
  308. }
  309. }
  310. }
  311. }
  312. /// <summary>
  313. /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例。
  314. /// </summary>
  315. /// <param name="sql">要执行的查询语句。</param>
  316. /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。</param>
  317. /// <returns></returns>
  318. /// <exception cref="Exception"></exception>
  319. public SQLiteDataReader ExecuteReader(string sql, params SQLiteParameter[] parameters)
  320. {
  321. SQLiteConnection connection = new SQLiteConnection(connectionString);
  322. SQLiteCommand command = new SQLiteCommand(sql, connection);
  323. try
  324. {
  325. if (parameters.Length != 0)
  326. {
  327. command.Parameters.AddRange(parameters);
  328. }
  329. connection.Open();
  330. return command.ExecuteReader(CommandBehavior.CloseConnection);
  331. }
  332. catch (Exception) { throw; }
  333. }
  334. /// <summary>
  335. /// 执行查询语句,并返回第一个结果。
  336. /// </summary>
  337. /// <param name="sql">查询语句。</param>
  338. /// <returns>查询结果。</returns>
  339. /// <exception cref="Exception"></exception>
  340. public object ExecuteScalar(string sql, params SQLiteParameter[] parameters)
  341. {
  342. using (SQLiteConnection conn = new SQLiteConnection(connectionString))
  343. {
  344. using (SQLiteCommand cmd = new SQLiteCommand(conn))
  345. {
  346. try
  347. {
  348. conn.Open();
  349. cmd.CommandText = sql;
  350. if (parameters.Length != 0)
  351. {
  352. cmd.Parameters.AddRange(parameters);
  353. }
  354. return cmd.ExecuteScalar();
  355. }
  356. catch (Exception) { throw; }
  357. }
  358. }
  359. }
  360. /// <summary>
  361. /// 读取整张数据表
  362. /// </summary>
  363. /// <returns>The full table.</returns>
  364. /// <param name="tableName">数据表名称</param>
  365. public DataTable ReadFullTable(string tableName,string order)
  366. {
  367. string queryString = "SELECT * FROM " + tableName+" order by "+ order;
  368. return ExecuteQuery(queryString);
  369. }
  370. /// <summary>
  371. /// /// 执行一个查询语句,返回一个包含查询结果的DataTable
  372. /// /// </summary>
  373. /// /// <param name="sql">要执行的查询语句</param>
  374. /// /// <param name="parameters">执行查询语句的参数</param>
  375. /// /// <returns></returns>
  376. public DataTable ExecuteDataTable(string sql, params SQLiteParameter[] parameters)
  377. {
  378. using (SQLiteConnection conn = new SQLiteConnection(connectionString))
  379. {
  380. using (SQLiteCommand command = new SQLiteCommand(sql, conn))
  381. {
  382. if (parameters != null)
  383. {
  384. command.Parameters.AddRange(parameters);
  385. }
  386. SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
  387. DataTable data = new DataTable();
  388. adapter.Fill(data);
  389. return data;
  390. }
  391. }
  392. }
  393. /// <summary>
  394. /// /// tbale转list
  395. /// /// </summary>
  396. /// /// <typeparam name="T"></typeparam>
  397. /// /// <returns></returns>
  398. public List<T> TableToList<T>(DataTable table) where T : class, new()
  399. {
  400. var result = new List<T>();
  401. var propertys = typeof(T).GetProperties();
  402. foreach (DataRow dr in table.Rows)
  403. {
  404. var item = new T();
  405. result.Add(item);
  406. foreach (var pi in propertys)
  407. {
  408. if (!table.Columns.Contains(pi.Name))
  409. continue;
  410. var value = dr[pi.Name];
  411. if (value is DBNull || value == null)
  412. continue;
  413. if (value.GetType().ToString() == "System.Int64")
  414. {
  415. pi.SetValue(item, Convert.ToInt32(value));
  416. }
  417. else
  418. {
  419. pi.SetValue(item, value);
  420. }
  421. }
  422. }
  423. return result;
  424. }
  425. /// <summary>
  426. /// /// tbale转list
  427. /// /// </summary>
  428. /// /// <typeparam name="T"></typeparam>
  429. /// /// <returns></returns>
  430. public List<T> RowsToList<T>(DataRow[] table) where T : class, new()
  431. {
  432. var result = new List<T>();
  433. var propertys = typeof(T).GetProperties();
  434. foreach (DataRow dr in table)
  435. {
  436. var item = new T();
  437. result.Add(item);
  438. foreach (var pi in propertys)
  439. {
  440. if (!dr.Table.Columns.Contains(pi.Name))
  441. continue;
  442. var value = dr[pi.Name];
  443. if (value is DBNull || value == null)
  444. continue;
  445. if (value.GetType().ToString() == "System.Int64")
  446. {
  447. pi.SetValue(item, Convert.ToInt32(value));
  448. }
  449. else
  450. {
  451. pi.SetValue(item, value);
  452. }
  453. }
  454. }
  455. return result;
  456. }
  457. /// <summary>
  458. /// 向指定数据表中插入数据
  459. /// </summary>
  460. /// <returns>The values.</returns>
  461. /// <param name="tableName">数据表名称</param>
  462. /// <param name="values">插入的数值</param>
  463. public DataTable InsertValues(string tableName, string[] values)
  464. {
  465. //获取数据表中字段数目
  466. int fieldCount = ReadFullTable(tableName,"").Columns.Count;
  467. //当插入的数据长度不等于字段数目时引发异常
  468. if (values.Length != fieldCount)
  469. {
  470. throw new SQLiteException("values.Length!=fieldCount");
  471. }
  472. string queryString = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'";
  473. for (int i = 1; i < values.Length; i++)
  474. {
  475. queryString += ", " + "'" + values[i] + "'";
  476. }
  477. queryString += " )";
  478. return ExecuteQuery(queryString);
  479. }
  480. /// <summary>
  481. /// 更新指定数据表内的数据
  482. /// </summary>
  483. /// <returns>The values.</returns>
  484. /// <param name="tableName">数据表名称</param>
  485. /// <param name="colNames">字段名</param>
  486. /// <param name="colValues">字段名对应的数据</param>
  487. /// <param name="key">关键字</param>
  488. /// <param name="value">关键字对应的值</param>
  489. /// <param name="operation">运算符:=,<,>,...,默认“=”</param>
  490. public DataTable UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string value, string operation = "=")
  491. {
  492. //当字段名称和字段数值不对应时引发异常
  493. if (colNames.Length != colValues.Length)
  494. {
  495. throw new SQLiteException("colNames.Length!=colValues.Length");
  496. }
  497. string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'";
  498. for (int i = 1; i < colValues.Length; i++)
  499. {
  500. queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'";
  501. }
  502. queryString += " WHERE " + key + operation + "'" + value + "'";
  503. return ExecuteQuery(queryString);
  504. }
  505. /// <summary>
  506. /// 删除指定数据表内的数据
  507. /// </summary>
  508. /// <returns>The values.</returns>
  509. /// <param name="tableName">数据表名称</param>
  510. /// <param name="colNames">字段名</param>
  511. /// <param name="colValues">字段名对应的数据</param>
  512. public DataTable DeleteValuesOR(string tableName, string[] colNames, string[] colValues, string[] operations)
  513. {
  514. //当字段名称和字段数值不对应时引发异常
  515. if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
  516. {
  517. throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
  518. }
  519. string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
  520. for (int i = 1; i < colValues.Length; i++)
  521. {
  522. queryString += "OR " + colNames[i] + operations[0] + "'" + colValues[i] + "'";
  523. }
  524. return ExecuteQuery(queryString);
  525. }
  526. /// <summary>
  527. /// 删除指定数据表内的数据
  528. /// </summary>
  529. /// <returns>The values.</returns>
  530. /// <param name="tableName">数据表名称</param>
  531. /// <param name="colNames">字段名</param>
  532. /// <param name="colValues">字段名对应的数据</param>
  533. public DataTable DeleteValuesAND(string tableName, string[] colNames, string[] colValues, string[] operations)
  534. {
  535. //当字段名称和字段数值不对应时引发异常
  536. if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
  537. {
  538. throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
  539. }
  540. string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
  541. for (int i = 1; i < colValues.Length; i++)
  542. {
  543. queryString += " AND " + colNames[i] + operations[i] + "'" + colValues[i] + "'";
  544. }
  545. return ExecuteQuery(queryString);
  546. }
  547. /// <summary>
  548. /// 创建数据表
  549. /// </summary> +
  550. /// <returns>The table.</returns>
  551. /// <param name="tableName">数据表名</param>
  552. /// <param name="colNames">字段名</param>
  553. /// <param name="colTypes">字段名类型</param>
  554. public int CreateTable(TableModel table)
  555. {
  556. StringBuilder builder = new StringBuilder();
  557. builder.Append("CREATE TABLE IF NOT EXISTS " + table.TableName+"(");
  558. int ind = 0;
  559. foreach (var item in table.columns)
  560. {
  561. builder.Append(item.ColumName + " " + item.ColumType + " " + (item.IsPrimarykey ? "PRIMARY KEY" : ""));
  562. if (++ind == table.columns.Count)
  563. {
  564. builder.Append(")");
  565. }
  566. else
  567. {
  568. builder.Append(",");
  569. }
  570. }
  571. return ExecuteNonQuery(builder.ToString());
  572. }
  573. /// <summary>
  574. /// 判断表存在
  575. /// </summary>
  576. /// <param name="tableName"></param>
  577. /// <returns></returns>
  578. public bool IsExist(string tableName)
  579. {
  580. string queryString = "select count(*) from sqlite_master where [type]='table' and [name]='"+ tableName + "'" ;
  581. Int64 i = (Int64)ExecuteScalar(queryString);
  582. return i > 0 ? true : false;
  583. }
  584. /// <summary>
  585. /// 删除数据库表
  586. /// </summary>
  587. /// <param name="tableName"></param>
  588. /// <returns></returns>
  589. public bool DeleteTable(string tableName)
  590. {
  591. string queryString = "drop table " + tableName;
  592. return ExecuteNonQuery(queryString)>0?true:false;
  593. }
  594. /// <summary>
  595. /// 删除数据库表数据
  596. /// </summary>
  597. /// <param name="tableName"></param>
  598. /// <returns></returns>
  599. public bool RemoveAllRows(string tableName)
  600. {
  601. string queryString = "DELETE FROM " + tableName;
  602. return ExecuteNonQuery(queryString) > 0 ? true : false;
  603. }
  604. /// <summary>
  605. /// Reads the table.
  606. /// </summary>
  607. /// <returns>The table.</returns>
  608. /// <param name="tableName">Table name.</param>
  609. /// <param name="items">Items.</param>
  610. /// <param name="colNames">Col names.</param>
  611. /// <param name="operations">Operations.</param>
  612. /// <param name="colValues">Col values.</param>
  613. public DataTable ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues)
  614. {
  615. string queryString = "SELECT " + items[0];
  616. for (int i = 1; i < items.Length; i++)
  617. {
  618. queryString += ", " + items[i];
  619. }
  620. queryString += " FROM " + tableName + " where 1=1";
  621. //+ " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0];
  622. for (int i = 0; i < colNames.Length; i++)
  623. {
  624. queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " ";
  625. }
  626. return ExecuteQuery(queryString);
  627. }
  628. }
  629. }