ActionMesSqliteDataClass.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.SQLite;
  4. using System.IO;
  5. using CCDCount.MODEL.ShuLiModel; // 确保引用ActiveObjectClass所在命名空间
  6. namespace CCDCount.DLL.SqlDataClass
  7. {
  8. public class ActionMesSqliteDataClass
  9. {
  10. private string DatabaseFile;
  11. private readonly string _connectionString;
  12. public ActionMesSqliteDataClass(string dbPath)
  13. {
  14. DatabaseFile = dbPath;
  15. _connectionString = $"Data Source={DatabaseFile};Version=3;"+
  16. "Journal Mode=WAL;" + // 使用WAL模式提高并发性
  17. "Synchronous=Normal;" + // 平衡性能和安全性
  18. "Cache Size=10000;" + // 增加缓存大小
  19. "Pooling=true;" + // 启用连接池
  20. "Max Pool Size=100;"; // 设置最大连接池大小
  21. string directoryPath = Path.GetDirectoryName(DatabaseFile);
  22. if (!Directory.Exists(directoryPath))
  23. {
  24. // 创建文件夹
  25. Directory.CreateDirectory(directoryPath);
  26. }
  27. InitializeDatabase();
  28. }
  29. private void InitializeDatabase()
  30. {
  31. if (!File.Exists(DatabaseFile))
  32. {
  33. SQLiteConnection.CreateFile(DatabaseFile);
  34. }
  35. using (var conn = new SQLiteConnection(_connectionString))
  36. {
  37. conn.Open();
  38. // 创建主表
  39. const string createActiveObjectTable = @"
  40. CREATE TABLE IF NOT EXISTS ActiveObject (
  41. Id INTEGER PRIMARY KEY AUTOINCREMENT,
  42. Num INTEGER NOT NULL,
  43. MinStartCol INTEGER NOT NULL,
  44. MaxEndCol INTEGER NOT NULL,
  45. LastSeenLineStartCol INTEGER NOT NULL,
  46. LastSeenLineEndCol INTEGER NOT NULL,
  47. StartLine INTEGER NOT NULL,
  48. LastSeenLine INTEGER NOT NULL,
  49. StartCheckTime TEXT NOT NULL,
  50. EndCheckTime TEXT NOT NULL,
  51. Area INTEGER NOT NULL,
  52. MaxLength REAL NOT NULL,
  53. ChannelNO INTEGER NOT NULL,
  54. ImageWidth INTEGER NOT NULL,
  55. StateCode INTEGER NOT NULL DEFAULT -1
  56. )";
  57. // 创建从表
  58. const string createRowDataTable = @"
  59. CREATE TABLE IF NOT EXISTS RowData (
  60. Id INTEGER PRIMARY KEY AUTOINCREMENT,
  61. ActiveObjectId INTEGER NOT NULL,
  62. RowsCol INTEGER NOT NULL,
  63. StartCol INTEGER NOT NULL,
  64. EndCol INTEGER NOT NULL,
  65. FOREIGN KEY (ActiveObjectId)
  66. REFERENCES ActiveObject(Id) ON DELETE CASCADE
  67. )";
  68. using (var cmd = new SQLiteCommand(conn))
  69. {
  70. cmd.CommandText = createActiveObjectTable;
  71. cmd.ExecuteNonQuery();
  72. cmd.CommandText = createRowDataTable;
  73. cmd.ExecuteNonQuery();
  74. }
  75. }
  76. }
  77. // 插入ActiveObjectClass对象及其关联数据
  78. public void InsertActiveObject(ActiveObjectClass activeObject)
  79. {
  80. using (var conn = new SQLiteConnection(_connectionString))
  81. {
  82. conn.Open();
  83. using (var transaction = conn.BeginTransaction())
  84. {
  85. try
  86. {
  87. // 插入主表数据
  88. const string insertActiveObject = @"
  89. INSERT INTO ActiveObject (
  90. Num, MinStartCol, MaxEndCol, LastSeenLineStartCol,
  91. LastSeenLineEndCol, StartLine, LastSeenLine,
  92. StartCheckTime, EndCheckTime, Area, MaxLength,
  93. ChannelNO, ImageWidth, StateCode
  94. ) VALUES (
  95. @Num, @MinStartCol, @MaxEndCol, @LastSeenLineStartCol,
  96. @LastSeenLineEndCol, @StartLine, @LastSeenLine,
  97. @StartCheckTime, @EndCheckTime, @Area, @MaxLength,
  98. @ChannelNO, @ImageWidth, @StateCode
  99. ); SELECT last_insert_rowid();";
  100. using (var cmd = new SQLiteCommand(insertActiveObject, conn))
  101. {
  102. cmd.Parameters.AddWithValue("@Num", activeObject.Num);
  103. cmd.Parameters.AddWithValue("@MinStartCol", activeObject.MinStartCol);
  104. cmd.Parameters.AddWithValue("@MaxEndCol", activeObject.MaxEndCol);
  105. cmd.Parameters.AddWithValue("@LastSeenLineStartCol", activeObject.LastSeenLineStartCol);
  106. cmd.Parameters.AddWithValue("@LastSeenLineEndCol", activeObject.LastSeenLineEndCol);
  107. cmd.Parameters.AddWithValue("@StartLine", activeObject.StartLine);
  108. cmd.Parameters.AddWithValue("@LastSeenLine", activeObject.LastSeenLine);
  109. cmd.Parameters.AddWithValue("@StartCheckTime", activeObject.StartCheckTime.ToString("o"));
  110. cmd.Parameters.AddWithValue("@EndCheckTime", activeObject.EndCheckTime.ToString("o"));
  111. cmd.Parameters.AddWithValue("@Area", activeObject.Area);
  112. cmd.Parameters.AddWithValue("@MaxLength", activeObject.MaxLength);
  113. cmd.Parameters.AddWithValue("@ChannelNO", activeObject.ChannelNO);
  114. cmd.Parameters.AddWithValue("@ImageWidth", activeObject.ImageWidth);
  115. cmd.Parameters.AddWithValue("@StateCode", activeObject.StateCode);
  116. // 获取新插入的主键ID
  117. var activeObjectId = Convert.ToInt32(cmd.ExecuteScalar());
  118. // 插入关联的RowData
  119. InsertRowData(conn, activeObjectId, activeObject.RowsData);
  120. }
  121. transaction.Commit();
  122. }
  123. catch
  124. {
  125. transaction.Rollback();
  126. throw;
  127. }
  128. }
  129. }
  130. }
  131. // 插入RowData数据
  132. private void InsertRowData(SQLiteConnection conn, int activeObjectId, List<RowStartEndCol> rowsData)
  133. {
  134. const string insertRowData = @"
  135. INSERT INTO RowData (
  136. ActiveObjectId, RowsCol, StartCol, EndCol
  137. ) VALUES (
  138. @ActiveObjectId, @RowsCol, @StartCol, @EndCol
  139. )";
  140. using (var cmd = new SQLiteCommand(insertRowData, conn))
  141. {
  142. foreach (var row in rowsData)
  143. {
  144. cmd.Parameters.Clear();
  145. cmd.Parameters.AddWithValue("@ActiveObjectId", activeObjectId);
  146. cmd.Parameters.AddWithValue("@RowsCol", row.RowsCol);
  147. cmd.Parameters.AddWithValue("@StartCol", row.StartCol);
  148. cmd.Parameters.AddWithValue("@EndCol", row.EndCol);
  149. cmd.ExecuteNonQuery();
  150. }
  151. }
  152. }
  153. // 根据ID查询完整对象
  154. public ActiveObjectClass GetActiveObjectById(int id)
  155. {
  156. using (var conn = new SQLiteConnection(_connectionString))
  157. {
  158. conn.Open();
  159. const string query = @"
  160. SELECT
  161. ao.*,
  162. rd.Id AS RowId, rd.RowsCol, rd.StartCol, rd.EndCol
  163. FROM ActiveObject ao
  164. LEFT JOIN RowData rd ON ao.Id = rd.ActiveObjectId
  165. WHERE ao.Id = @Id";
  166. using (var cmd = new SQLiteCommand(query, conn))
  167. {
  168. cmd.Parameters.AddWithValue("@Id", id);
  169. using (var reader = cmd.ExecuteReader())
  170. {
  171. ActiveObjectClass activeObject = null;
  172. var rowsData = new List<RowStartEndCol>();
  173. while (reader.Read())
  174. {
  175. // 只初始化主对象一次
  176. if (activeObject == null)
  177. {
  178. activeObject = new ActiveObjectClass
  179. {
  180. Num = Convert.ToInt32(reader["Num"]),
  181. MinStartCol = Convert.ToInt32(reader["MinStartCol"]),
  182. MaxEndCol = Convert.ToInt32(reader["MaxEndCol"]),
  183. LastSeenLineStartCol = Convert.ToInt32(reader["LastSeenLineStartCol"]),
  184. LastSeenLineEndCol = Convert.ToInt32(reader["LastSeenLineEndCol"]),
  185. StartLine = Convert.ToInt64(reader["StartLine"]),
  186. LastSeenLine = Convert.ToInt64(reader["LastSeenLine"]),
  187. StartCheckTime = DateTime.Parse(reader["StartCheckTime"].ToString()),
  188. EndCheckTime = DateTime.Parse(reader["EndCheckTime"].ToString()),
  189. Area = Convert.ToInt32(reader["Area"]),
  190. MaxLength = Convert.ToDouble(reader["MaxLength"]),
  191. ChannelNO = Convert.ToInt32(reader["ChannelNO"]),
  192. ImageWidth = Convert.ToInt32(reader["ImageWidth"]),
  193. StateCode = Convert.ToInt32(reader["StateCode"]),
  194. RowsData = rowsData
  195. };
  196. }
  197. // 添加行数据(确保RowData记录存在)
  198. if (!reader.IsDBNull(reader.GetOrdinal("RowId")))
  199. {
  200. rowsData.Add(new RowStartEndCol
  201. {
  202. RowsCol = Convert.ToInt64(reader["RowsCol"]),
  203. StartCol = Convert.ToInt32(reader["StartCol"]),
  204. EndCol = Convert.ToInt32(reader["EndCol"])
  205. });
  206. }
  207. }
  208. return activeObject;
  209. }
  210. }
  211. }
  212. }
  213. public List<ActiveObjectClass> GetActiveObjectForPage(int StartLine, int EndLine)
  214. {
  215. List<ActiveObjectClass> activeObjects = new List<ActiveObjectClass>();
  216. using (var conn = new SQLiteConnection(_connectionString))
  217. {
  218. conn.Open();
  219. const string query = @"
  220. SELECT
  221. ao.*,
  222. rd.Id AS RowId, rd.RowsCol, rd.StartCol, rd.EndCol
  223. FROM ActiveObject ao
  224. LEFT JOIN RowData rd ON ao.Id = rd.ActiveObjectId
  225. WHERE ao.StartLine <= @StartLine AND LastSeenLine>=@LastSeenLine ORDER BY rd.Id";
  226. using (var cmd = new SQLiteCommand(query, conn))
  227. {
  228. cmd.Parameters.AddWithValue("@StartLine", EndLine);
  229. cmd.Parameters.AddWithValue("@LastSeenLine", StartLine);
  230. using (var reader = cmd.ExecuteReader())
  231. {
  232. int NowId = -1;
  233. ActiveObjectClass activeObject = null;
  234. var rowsData = new List<RowStartEndCol>();
  235. while (reader.Read())
  236. {
  237. object value = reader["Id"];
  238. if (!Convert.IsDBNull(value))
  239. {
  240. if (NowId != Convert.ToInt32(reader["Id"]))
  241. {
  242. if (activeObject != null)
  243. {
  244. activeObjects.Add(activeObject);
  245. activeObject = null;
  246. rowsData = new List<RowStartEndCol>();
  247. }
  248. NowId = Convert.ToInt32(reader["Id"]);
  249. }
  250. // 只初始化主对象一次
  251. if (activeObject == null)
  252. {
  253. activeObject = new ActiveObjectClass
  254. {
  255. Num = Convert.ToInt32(reader["Num"]),
  256. MinStartCol = Convert.ToInt32(reader["MinStartCol"]),
  257. MaxEndCol = Convert.ToInt32(reader["MaxEndCol"]),
  258. LastSeenLineStartCol = Convert.ToInt32(reader["LastSeenLineStartCol"]),
  259. LastSeenLineEndCol = Convert.ToInt32(reader["LastSeenLineEndCol"]),
  260. StartLine = Convert.ToInt64(reader["StartLine"]),
  261. LastSeenLine = Convert.ToInt64(reader["LastSeenLine"]),
  262. StartCheckTime = DateTime.Parse(reader["StartCheckTime"].ToString()),
  263. EndCheckTime = DateTime.Parse(reader["EndCheckTime"].ToString()),
  264. Area = Convert.ToInt32(reader["Area"]),
  265. MaxLength = Convert.ToDouble(reader["MaxLength"]),
  266. ChannelNO = Convert.ToInt32(reader["ChannelNO"]),
  267. ImageWidth = Convert.ToInt32(reader["ImageWidth"]),
  268. StateCode = Convert.ToInt32(reader["StateCode"]),
  269. RowsData = rowsData
  270. };
  271. }
  272. // 添加行数据(确保RowData记录存在)
  273. rowsData.Add(new RowStartEndCol
  274. {
  275. RowsCol = Convert.ToInt64(reader["RowsCol"]),
  276. StartCol = Convert.ToInt32(reader["StartCol"]),
  277. EndCol = Convert.ToInt32(reader["EndCol"])
  278. });
  279. }
  280. }
  281. }
  282. }
  283. }
  284. return activeObjects;
  285. }
  286. public void GetAllActionMinStartMaxEndLine(out int Num, out int StartLine, out int EndLine)
  287. {
  288. using (var conn = new SQLiteConnection(_connectionString))
  289. {
  290. conn.Open();
  291. const string query = @"
  292. SELECT MAX(Num) AS Num, MAX(LastSeenLine) AS MaxLastSeenLine, MIN(StartLine) AS MinStartLine FROM ActiveObject";
  293. int MinStartLine = 0;
  294. int MaxLastSeenLine = 0;
  295. int StartNum = 0;
  296. using (var cmd = new SQLiteCommand(query, conn))
  297. {
  298. using (var reader = cmd.ExecuteReader())
  299. {
  300. while (reader.Read())
  301. {
  302. object value = reader["MinStartLine"];
  303. if (!Convert.IsDBNull(value))
  304. {
  305. MinStartLine = Convert.ToInt32(reader["MinStartLine"]);
  306. MaxLastSeenLine = Convert.ToInt32(reader["MaxLastSeenLine"]);
  307. StartNum = Convert.ToInt32(reader["Num"]);
  308. }
  309. }
  310. }
  311. }
  312. StartLine = MinStartLine;
  313. EndLine = MaxLastSeenLine;
  314. Num = StartNum;
  315. }
  316. }
  317. // 根据Num查询ID
  318. public int GetActiveIdByNum(int Num)
  319. {
  320. int result = -1;
  321. using (var conn = new SQLiteConnection(_connectionString))
  322. {
  323. conn.Open();
  324. const string query = @"
  325. SELECT * FROM ActiveObject WHERE Num = @Num";
  326. using (var cmd = new SQLiteCommand(query, conn))
  327. {
  328. cmd.Parameters.AddWithValue("@Num", Num);
  329. using (var reader = cmd.ExecuteReader())
  330. {
  331. var rowsData = new List<RowStartEndCol>();
  332. while (reader.Read())
  333. {
  334. object value = reader["Id"];
  335. if (!Convert.IsDBNull(value))
  336. {
  337. result = Convert.ToInt32(reader["Id"]);
  338. }
  339. }
  340. }
  341. }
  342. }
  343. return result;
  344. }
  345. }
  346. }