MeasureDB.cs 12 KB

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