MeasureDB.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. //20201104 数据库基本操作 只包含创建和写入的动作,删除和读出查询的动作不包括在其中
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.IO;
  8. using System.Threading;
  9. using System.Data.SQLite;
  10. using MeasureData;
  11. using Extender;
  12. namespace DBManager
  13. {
  14. public class MeasureDB
  15. {
  16. public SQLiteConnection m_db;
  17. private MeasureFile m_measureFile; //测量文件
  18. public MeasureDB(MeasureFile mf)
  19. {
  20. Init(mf);
  21. CreateDB();
  22. CreateAnalysisPointsTable();
  23. CreateXrayDataTable();
  24. CreateAreaPositionTable();
  25. CreateElementTable();
  26. }
  27. public void Init(MeasureFile mf)
  28. {
  29. m_measureFile = mf;
  30. }
  31. //创建一个空的数据库
  32. public void CreateDB()
  33. {
  34. string path = Path.GetDirectoryName(m_measureFile.FileName);
  35. path = "D:\\HOZ\\test\\MeasureDB.db";
  36. if (File.Exists(path))
  37. {
  38. File.Delete(path);
  39. }
  40. m_db = new SQLiteConnection("data source =" + path);
  41. m_db.Open();
  42. }
  43. //关闭数据库
  44. public void CloseDB()
  45. {
  46. m_db.Close();
  47. }
  48. //创建分析点表
  49. public void CreateAnalysisPointsTable()
  50. {
  51. string sql = "CREATE TABLE AnalysisPoints(";
  52. string sPrimary = ", PRIMARY KEY( ";
  53. //第1列, ID,是主键
  54. sql = sql + "ID INTEGER";
  55. //sPrimary = sPrimary + "ID";
  56. //第2列, ImageID,是主键
  57. sql = sql + ",";
  58. sql = sql + "ImageID INTEGER";
  59. //第3列,Name
  60. sql = sql + ",";
  61. sql = sql + "Name TEXT";
  62. //第4列,EDSImagePath
  63. sql = sql + ",";
  64. sql = sql + "EDSImagePath TEXT";
  65. //第5列,HavePoints
  66. sql = sql + ",";
  67. sql = sql + "HavePoints INTEGER";
  68. //第6列,PointsNum
  69. sql = sql + ",";
  70. sql = sql + "PointsNum INTEGER";
  71. //第7列,HaveAreas
  72. sql = sql + ",";
  73. sql = sql + "HaveAreas INTEGER";
  74. //第8列,AreasNum
  75. sql = sql + ",";
  76. sql = sql + "AreasNum INTEGER";
  77. //sPrimary = sPrimary + ")";
  78. //sql = sql + sPrimary + ")";
  79. sql = sql + ")";
  80. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  81. command.ExecuteNonQuery();
  82. }
  83. //XrayData表
  84. public void CreateXrayDataTable()
  85. {
  86. string sql = "CREATE TABLE XrayData(";
  87. string sPrimary = ", PRIMARY KEY( ";
  88. //第1列, ID,是主键
  89. sql = sql + "ID INTEGER";
  90. sPrimary = sPrimary + "ID";
  91. //第2列,APID
  92. sql = sql + ",";
  93. sql = sql + "APID INTEGER";
  94. sPrimary = sPrimary + ", APID";
  95. //第3列,图像ID
  96. sql = sql + ",";
  97. sql = sql + "ImageID INTEGER";
  98. //第4列,Type
  99. sql = sql + ",";
  100. sql = sql + "Type INTEGER";
  101. //第5列,X
  102. sql = sql + ",";
  103. sql = sql + "X INTEGER";
  104. //第6列,Y
  105. sql = sql + ",";
  106. sql = sql + "Y INTEGER";
  107. //第7列,AreasID
  108. sql = sql + ",";
  109. sql = sql + "AreasID INTEGER";
  110. //第8列,ElementNum
  111. sql = sql + ",";
  112. sql = sql + "ElementNum INTEGER";
  113. //第9列,XrayData
  114. sql = sql + ",";
  115. sql = sql + "XrayData BLOB";
  116. sPrimary = sPrimary + ")";
  117. sql = sql + sPrimary + ")";
  118. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  119. command.ExecuteNonQuery();
  120. }
  121. //创建元素表
  122. public void CreateElementTable()
  123. {
  124. string sql = "CREATE TABLE Element(";
  125. string sPrimary = ", PRIMARY KEY( ";
  126. //第1列, ID,是主键
  127. sql = sql + "XayID INTEGER";
  128. sPrimary = sPrimary + "XayID";
  129. //第3列,ElementNum,是主键
  130. sql = sql + ",";
  131. sql = sql + "ElementNum INTEGER";
  132. sPrimary = sPrimary + ", ElementNum";
  133. //第4列,ElementID,是主键
  134. sql = sql + ",";
  135. sql = sql + "ElementID INTEGER";
  136. sPrimary = sPrimary + ", ElementID";
  137. //第5列,Name
  138. sql = sql + ",";
  139. sql = sql + "Name TEXT";
  140. //第6列,Percent
  141. sql = sql + ",";
  142. sql = sql + "Percent FLOAT";
  143. sPrimary = sPrimary + ")";
  144. sql = sql + sPrimary + ")";
  145. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  146. command.ExecuteNonQuery();
  147. }
  148. //创建位置信息表
  149. public void CreateAreaPositionTable()
  150. {
  151. string sql = "CREATE TABLE AreaPosition(";
  152. string sPrimary = ", PRIMARY KEY( ";
  153. //第1列, ID,是主键
  154. sql = sql + "XrayID INTEGER";
  155. sPrimary = sPrimary + "XrayID";
  156. //第2列,AID
  157. sql = sql + ",";
  158. sql = sql + "AID INTEGER";
  159. sPrimary = sPrimary + ", AID";
  160. //第3列,SegNum
  161. sql = sql + ",";
  162. sql = sql + "SegNum INTEGER";
  163. sPrimary = sPrimary + ", SegNum";
  164. //第4列,SegID
  165. sql = sql + ",";
  166. sql = sql + "SegID INTEGER";
  167. sPrimary = sPrimary + ", SegID";
  168. //第5列,X
  169. sql = sql + ",";
  170. sql = sql + "X INTEGER";
  171. //第6列,Y
  172. sql = sql + ",";
  173. sql = sql + "Y INTEGER";
  174. //第7列,Length
  175. sql = sql + ",";
  176. sql = sql + "Length INTEGER";
  177. sPrimary = sPrimary + ")";
  178. sql = sql + sPrimary + ")";
  179. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  180. command.ExecuteNonQuery();
  181. }
  182. public bool InsetAPoint(int PointsId, string PointName, string EDSImagePath, int PointsNum, int AreasNum, int ImageID)
  183. {
  184. //开启一个事务
  185. using (SQLiteTransaction tr = m_db.BeginTransaction())
  186. {
  187. //向分析点表插入数据
  188. string sql = "INSERT INTO AnalysisPoints(ID, ImageID, Name, EDSImagePath, HavePoints, PointsNum, HaveAreas, AreasNum) values ("
  189. + PointsId.ToString() + ","
  190. + ImageID.ToString() + ","
  191. + "'" + PointName + "'" + ","
  192. + "'" + EDSImagePath + "'" + ","
  193. + Convert.ToInt32(Convert.ToBoolean(PointsNum)).ToString() + ","
  194. + PointsNum.ToString() + ","
  195. + Convert.ToInt32(Convert.ToBoolean(AreasNum)).ToString() + ","
  196. + AreasNum.ToString() + ")";
  197. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  198. command.ExecuteNonQuery();
  199. tr.Commit();
  200. }
  201. return true;
  202. }
  203. //插入一条点扫描Xray的信息
  204. public bool InsertAPointXay(int PointsId, int XrayId, int X, int Y, long[] XrayData, Dictionary<string, double> listElement, int ImageID)
  205. {
  206. byte[] bArray = new byte[8000];
  207. for (int i = 0; i < 2000; i++)
  208. {
  209. byte[] temps = BitConverter.GetBytes(XrayData[i]);
  210. bArray[i * 4] = temps[0];
  211. bArray[i * 4 + 1] = temps[1];
  212. bArray[i * 4 + 2] = temps[2];
  213. bArray[i * 4 + 3] = temps[3];
  214. }
  215. //开启一个事务
  216. using (SQLiteTransaction tr = m_db.BeginTransaction())
  217. {
  218. //向能谱数据表插入数据
  219. string sql = "INSERT INTO XrayData(ID, APID, ImageID, Type, X, Y, AreasID, ElementNum, XrayData) values ("
  220. + XrayId.ToString() + ","
  221. + PointsId.ToString() + ","
  222. + ImageID.ToString() + ","
  223. + 0.ToString() + ","
  224. + X.ToString() + ","
  225. + Y.ToString() + ","
  226. + (-1).ToString() + ","
  227. + listElement.Count.ToString() + ",:XrayData)";
  228. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  229. command.Parameters.Add("XrayData", System.Data.DbType.Binary).Value = bArray; // BLOB
  230. command.ExecuteNonQuery();
  231. //向能谱元素表插入数据
  232. int i = 1;
  233. foreach (KeyValuePair<string, double> element in listElement)
  234. {
  235. sql = "INSERT INTO Element(XayID, ElementNum, ElementID, Name, Percent) values ("
  236. + XrayId.ToString() + ","
  237. + listElement.Count.ToString() + ","
  238. + i.ToString() + ",'"
  239. + element.Key + "',"
  240. + element.Value.ToString() + ")";
  241. command = new SQLiteCommand(sql, m_db);
  242. command.ExecuteNonQuery();
  243. i++;
  244. }
  245. tr.Commit();
  246. Thread.Sleep(500);
  247. }
  248. return true;
  249. }
  250. //插入一条面扫描Xray的信息
  251. public bool InsertAAreaXay(int PointsId, int XrayId, int AreaId, List<Segment> listSeg, long[] XrayData, Dictionary<string, double> listElement, int ImageID)
  252. {
  253. byte[] bArray = new byte[8000];
  254. for (int i = 0; i < 2000; i++)
  255. {
  256. byte[] temps = BitConverter.GetBytes(XrayData[i]);
  257. bArray[i] = temps[0];
  258. bArray[i + 1] = temps[1];
  259. bArray[i + 2] = temps[2];
  260. bArray[i + 3] = temps[3];
  261. }
  262. //开启一个事务
  263. using (SQLiteTransaction tr = m_db.BeginTransaction())
  264. {
  265. //向能谱数据表插入数据
  266. string sql = "INSERT INTO XrayData(ID, APID, ImageID, Type, X, Y, AreasID, ElementNum, XrayData) values ("
  267. + XrayId.ToString() + ","
  268. + PointsId.ToString() + ","
  269. + ImageID.ToString() + ","
  270. + 1.ToString() + ","
  271. + (-1).ToString() + ","
  272. + (-1).ToString() + ","
  273. + AreaId.ToString() + ","
  274. + listElement.Count.ToString() + ",:XrayData)";
  275. SQLiteCommand command = new SQLiteCommand(sql, m_db);
  276. command.Parameters.Add("XrayData", System.Data.DbType.Binary).Value = bArray; // BLOB
  277. command.ExecuteNonQuery();
  278. //向能谱元素表插入数据
  279. int i = 1;
  280. foreach (KeyValuePair<string, double> element in listElement)
  281. {
  282. sql = "INSERT INTO Element(XayID, ElementNum, ElementID, Name, Percent) values ("
  283. + XrayId.ToString() + ","
  284. + listElement.Count.ToString() + ","
  285. + i.ToString() + ",'"
  286. + element.Key + "',"
  287. + element.Value.ToString() + ")";
  288. command = new SQLiteCommand(sql, m_db);
  289. command.ExecuteNonQuery();
  290. i++;
  291. }
  292. //向位置表插入数据
  293. i = 1;
  294. foreach (Segment seg in listSeg)
  295. {
  296. sql = "INSERT INTO AreaPosition(XrayID, AID, SegNum, SegID, X, Y, Length) values ("
  297. + XrayId.ToString() + ","
  298. + AreaId.ToString() + ","
  299. + listSeg.Count.ToString() + ","
  300. + i.ToString() + ","
  301. + seg.X.ToString() + ","
  302. + seg.Y.ToString() + ","
  303. + seg.Length.ToString() + ")";
  304. command = new SQLiteCommand(sql, m_db);
  305. command.ExecuteNonQuery();
  306. i++;
  307. }
  308. tr.Commit();
  309. }
  310. return true;
  311. }
  312. }
  313. }