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

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