CNAS取数仪器端升级
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

420 行
17KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.SQLite;
  6. using System.Data;
  7. using CnasSynchronousCommon;
  8. namespace CnasSynchronusDAL
  9. {
  10. public static class SQLiteDAL
  11. {
  12. private static string connectionString = string.Empty;
  13. /// <summary>
  14. /// 根据数据源、密码、版本号设置连接字符串。
  15. /// </summary>
  16. /// <param name="datasource">数据源。</param>
  17. /// <param name="password">密码。</param>
  18. /// <param name="version">版本号(缺省为3)。</param>
  19. public static void SetConnectionString(string datasource, string password, int version = 3)
  20. {
  21. connectionString = string.Format("Data Source={0};Version={1};password={2}",
  22. datasource, version, password);
  23. }
  24. public static void SetConnectionString(string datasource)
  25. {
  26. connectionString = datasource;
  27. }
  28. internal static DataTable ReadSQLiteTableStruct(string strViewName,string strViewSql,string strTableName)
  29. {
  30. DataTable dt = new DataTable();
  31. try
  32. {
  33. string sql = "";
  34. if (strViewName == strTableName && string.IsNullOrWhiteSpace(strViewName))
  35. sql = strViewSql + "where 1=0";
  36. else
  37. sql = string.Format("SELECT * FROM [{0}] where 1=0", strTableName); //查询字符串
  38. dt = ExecuteQuery(sql, new SQLiteParameter[] { });
  39. }
  40. catch (Exception ex)
  41. {
  42. //发生异常,写入日志
  43. AppLog.Error(ex.Message);
  44. //throw ex;
  45. }
  46. return dt;
  47. }
  48. /// <summary>
  49. /// 创建一个数据库文件。如果存在同名数据库文件,则会覆盖。
  50. /// </summary>
  51. /// <param name="dbName">数据库文件名。为null或空串时不创建。</param>
  52. /// <param name="password">(可选)数据库密码,默认为空。</param>
  53. /// <exception cref="Exception"></exception>
  54. public static void CreateDB(string dbName)
  55. {
  56. if (!string.IsNullOrEmpty(dbName))
  57. {
  58. try { SQLiteConnection.CreateFile(dbName); }
  59. catch (Exception) { throw; }
  60. }
  61. }
  62. /// <summary>
  63. /// 对SQLite数据库执行增删改操作,返回受影响的行数。
  64. /// </summary>
  65. /// <param name="sql">要执行的增删改的SQL语句。</param>
  66. /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。</param>
  67. /// <returns></returns>
  68. /// <exception cref="Exception"></exception>
  69. public static int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
  70. {
  71. int affectedRows = 0;
  72. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  73. {
  74. using (SQLiteCommand command = new SQLiteCommand(connection))
  75. {
  76. try
  77. {
  78. connection.Open();
  79. command.CommandText = sql;
  80. if (parameters.Length != 0)
  81. {
  82. command.Parameters.AddRange(parameters);
  83. }
  84. affectedRows = command.ExecuteNonQuery();
  85. }
  86. catch (Exception ex)
  87. {
  88. AppLog.Error(ex.Message);
  89. throw ex;
  90. }
  91. }
  92. }
  93. return affectedRows;
  94. }
  95. /// <summary>
  96. /// 批量处理数据操作语句。
  97. /// </summary>
  98. /// <param name="list">SQL语句集合。</param>
  99. /// <exception cref="Exception"></exception>
  100. public static void ExecuteNonQueryBatch(List<KeyValuePair<string, SQLiteParameter[]>> list)
  101. {
  102. using (SQLiteConnection conn = new SQLiteConnection(connectionString))
  103. {
  104. try { conn.Open(); }
  105. catch { throw; }
  106. using (SQLiteTransaction tran = conn.BeginTransaction())
  107. {
  108. using (SQLiteCommand cmd = new SQLiteCommand(conn))
  109. {
  110. try
  111. {
  112. foreach (var item in list)
  113. {
  114. cmd.CommandText = item.Key;
  115. if (item.Value != null)
  116. {
  117. cmd.Parameters.AddRange(item.Value);
  118. }
  119. cmd.ExecuteNonQuery();
  120. }
  121. tran.Commit();
  122. }
  123. catch (Exception ex)
  124. {
  125. tran.Rollback();
  126. AppLog.Error(ex.Message);
  127. throw ex;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. /// <summary>
  134. /// 执行查询语句,并返回第一个结果。
  135. /// </summary>
  136. /// <param name="sql">查询语句。</param>
  137. /// <returns>查询结果。</returns>
  138. /// <exception cref="Exception"></exception>
  139. public static object ExecuteScalar(string sql, params SQLiteParameter[] parameters)
  140. {
  141. using (SQLiteConnection conn = new SQLiteConnection(connectionString))
  142. {
  143. using (SQLiteCommand cmd = new SQLiteCommand(conn))
  144. {
  145. try
  146. {
  147. conn.Open();
  148. cmd.CommandText = sql;
  149. if (parameters.Length != 0)
  150. {
  151. cmd.Parameters.AddRange(parameters);
  152. }
  153. return cmd.ExecuteScalar();
  154. }
  155. catch (Exception ex)
  156. {
  157. AppLog.Error(ex.Message);
  158. throw ex;
  159. }
  160. }
  161. }
  162. }
  163. /// <summary>
  164. /// 执行一个查询语句,返回一个包含查询结果的DataTable。
  165. /// </summary>
  166. /// <param name="sql">要执行的查询语句。</param>
  167. /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。</param>
  168. /// <returns></returns>
  169. /// <exception cref="Exception"></exception>
  170. public static DataTable ExecuteQuery(string sql, params SQLiteParameter[] parameters)
  171. {
  172. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  173. {
  174. using (SQLiteCommand command = new SQLiteCommand(sql, connection))
  175. {
  176. if (parameters.Length != 0)
  177. {
  178. command.Parameters.AddRange(parameters);
  179. }
  180. SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
  181. DataTable data = new DataTable();
  182. try { adapter.Fill(data); }
  183. catch (Exception ex)
  184. {
  185. AppLog.Error(ex.Message);
  186. throw ex;
  187. }
  188. return data;
  189. }
  190. }
  191. }
  192. /// <summary>
  193. /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例。
  194. /// </summary>
  195. /// <param name="sql">要执行的查询语句。</param>
  196. /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。</param>
  197. /// <returns></returns>
  198. /// <exception cref="Exception"></exception>
  199. public static SQLiteDataReader ExecuteReader(string sql, params SQLiteParameter[] parameters)
  200. {
  201. SQLiteConnection connection = new SQLiteConnection(connectionString);
  202. SQLiteCommand command = new SQLiteCommand(sql, connection);
  203. try
  204. {
  205. if (parameters.Length != 0)
  206. {
  207. command.Parameters.AddRange(parameters);
  208. }
  209. connection.Open();
  210. return command.ExecuteReader(CommandBehavior.CloseConnection);
  211. }
  212. catch (Exception ex)
  213. {
  214. AppLog.Error(ex.Message);
  215. throw ex;
  216. }
  217. }
  218. /// <summary>
  219. /// 查询数据库中的所有数据类型信息。
  220. /// </summary>
  221. /// <returns></returns>
  222. /// <exception cref="Exception"></exception>
  223. public static DataTable GetSchema()
  224. {
  225. using (SQLiteConnection connection = new SQLiteConnection(connectionString))
  226. {
  227. try
  228. {
  229. connection.Open();
  230. return connection.GetSchema("TABLES");
  231. }
  232. catch (Exception ex)
  233. {
  234. AppLog.Error(ex.Message);
  235. throw ex;
  236. }
  237. }
  238. }
  239. /// <summary>
  240. /// 读取表名和表结构
  241. /// </summary>
  242. /// <param name="strPath"></param>
  243. /// <returns></returns>
  244. public static Dictionary<string, DataTable> ReadSQLiteTables()
  245. {
  246. Dictionary<string, DataTable> dictTables = new Dictionary<string, DataTable>();
  247. try
  248. {
  249. string sql = "";
  250. DataTable TablesName = ExecuteQuery("select * from sqlite_master;", new SQLiteParameter[] { });//得到所有表
  251. foreach (DataRow dr in TablesName.Rows)
  252. {
  253. string strType = dr[0].ToString();
  254. if (strType.ToLower() == "table"|| strType.ToLower() == "view")
  255. {
  256. string strTableName = dr[1].ToString();
  257. sql = string.Format("SELECT * FROM [{0}] where 1=0", strTableName); //查询字符串
  258. dictTables.Add(strTableName.ToUpper(), ExecuteQuery(sql, new SQLiteParameter[] { }));
  259. }
  260. }
  261. }
  262. catch (Exception ex)
  263. {
  264. //发生异常,写入日志
  265. AppLog.Error(ex.Message);
  266. //throw ex;
  267. }
  268. return dictTables;
  269. }
  270. public static DataTable ReadSQLiteTablesByDate(string strViewName,string strViewSql,string strTableName,string strDateColumn,string strDate)
  271. {
  272. DataTable dtReturn = new DataTable();
  273. try
  274. {
  275. string sql = "";
  276. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  277. sql = strViewSql + string.Format(" where {0}>'{1}'", strDateColumn, Convert.ToDateTime(strDate).ToString("yyyy-MM-dd HH:mm:ss"));
  278. else
  279. sql = string.Format("SELECT * FROM [{0}] where {1}>'{2}'", strTableName, strDateColumn, Convert.ToDateTime(strDate).ToString("yyyy-MM-dd HH:mm:ss")); //查询字符串
  280. DataTable dt = ExecuteQuery(sql, new SQLiteParameter[] { });
  281. Dictionary<string, string> dictFiled = GetSpecialOperaField(strTableName);
  282. if (dictFiled.Count > 0)
  283. dtReturn = DateAndTimeTypeOpera(dt, dictFiled);
  284. else
  285. dtReturn = dt;
  286. }
  287. catch (Exception ex)
  288. {
  289. //发生异常,写入日志
  290. AppLog.Error(ex.Message);
  291. throw ex;
  292. }
  293. return dtReturn;
  294. }
  295. /// <summary>
  296. /// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段
  297. /// </summary>
  298. /// <returns></returns>
  299. private static Dictionary<string, string> GetSpecialOperaField(string strTableName)
  300. {
  301. Dictionary<string, string> DictFiled = new Dictionary<string, string>();
  302. DataTable dt = new DataTable();
  303. try
  304. {
  305. string sql = string.Format("PRAGMA table_info({0});", strTableName); //查询字符串
  306. dt = ExecuteQuery(sql, new SQLiteParameter[] { });
  307. foreach (DataRow dr in dt.Rows)
  308. {
  309. if (dr["Type"].ToString().ToLower() == "date" || dr["Type"].ToString().ToLower() == "time")
  310. {
  311. DictFiled.Add(dr["name"].ToString(), dr["Type"].ToString());
  312. }
  313. }
  314. }
  315. catch (Exception ex)
  316. {
  317. //发生异常,写入日志
  318. AppLog.Error(ex.Message);
  319. }
  320. return DictFiled;
  321. }
  322. /// <summary>
  323. /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型
  324. /// </summary>
  325. private static DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary<string, string> DictSpecialField)
  326. {
  327. DataTable dtNewFormat = new DataTable();
  328. //添加列
  329. foreach (DataColumn dc in dt.Columns)
  330. {
  331. if (DictSpecialField.ContainsKey(dc.ColumnName))
  332. {
  333. string strDateType = DictSpecialField[dc.ColumnName];
  334. switch (strDateType.ToUpper())
  335. {
  336. case "DATE":
  337. case "TIME":
  338. case "DATETIME":
  339. dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确)
  340. break;
  341. default:
  342. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  343. break;
  344. }
  345. }
  346. else
  347. {
  348. dtNewFormat.Columns.Add(dc.ColumnName,dc.DataType);
  349. }
  350. }
  351. //添加数据行
  352. foreach (DataRow dr in dt.Rows)
  353. {
  354. DataRow drNewRow = dtNewFormat.NewRow();
  355. foreach (DataColumn dc in dtNewFormat.Columns)
  356. {
  357. if (!DictSpecialField.ContainsKey(dc.ColumnName))
  358. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  359. else
  360. {
  361. switch (DictSpecialField[dc.ColumnName].ToUpper())
  362. {
  363. case "DATE":
  364. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  365. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
  366. break;
  367. case "TIME":
  368. if(dr[dc.ColumnName]!=null&& dr[dc.ColumnName].ToString()!="")
  369. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("HH:mm:ss");
  370. break;
  371. case "DATETIME":
  372. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  373. {
  374. string strTime= Convert.ToDateTime(dr[dc.ColumnName]).ToString("HH:mm:ss");
  375. if (strTime=="00:00:00")
  376. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
  377. else
  378. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss");
  379. }
  380. break;
  381. default:
  382. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  383. break;
  384. }
  385. }
  386. }
  387. dtNewFormat.Rows.Add(drNewRow);
  388. }
  389. //返回数据
  390. return dtNewFormat;
  391. }
  392. }
  393. }