using OTSCommon.DBOperate.Model; using OTSModelSharp.DTLBase; using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OTSModelSharp.DTLBase { /// /// SQLite 操作类 /// public class SQLiteHelper { /// /// 数据库连接字符串 /// private string connectionString; SQLiteConnection connForTrans; SQLiteCommand cmdForTrans; SQLiteTransaction trans; private NLog.Logger log; /// /// 构造函数 /// /// 连接SQLite库字符串 public SQLiteHelper(string a_sFileName) { log = NLog.LogManager.GetCurrentClassLogger(); connectionString = "data source='" + a_sFileName + "'" + ";Version=3;"; } /// /// 根据数据源、密码、版本号设置连接字符串。 /// /// 数据源。 /// 密码。 /// 版本号(缺省为3)。 public void SetConnectionString(string datasource, string password, int version = 3) { connectionString = string.Format("Data Source={0};Version={1};password={2}", datasource, version, password); } public SQLiteConnection GetDBConnection() { SQLiteConnection connection = new SQLiteConnection(connectionString); connForTrans = connection; return connection; } /// /// 创建一个数据库文件。如果存在同名数据库文件,则会覆盖。 /// /// 数据库文件名。为null或空串时不创建。 /// (可选)数据库密码,默认为空。 /// public static void CreateNewDatabase(string dbName) { if (!string.IsNullOrEmpty(dbName)) { try { SQLiteConnection.CreateFile(dbName); } catch (Exception) { throw; } } } /// /// 删除指定的数据库文件 /// /// public void DeleteDataBase(string basename) { try { if (System.IO.File.Exists(basename)) { System.IO.File.Delete(basename); } } catch (Exception) { throw; } } /// /// 执行SQL命令 /// /// The query. /// SQL命令字符串 public DataTable ExecuteQuery(string sql, params SQLiteParameter[] parameters) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { if (parameters.Length != 0) { command.Parameters.AddRange(parameters); } SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); DataTable data = new DataTable(); try { adapter.Fill(data); } catch (Exception) { throw; } return data; } } } /// /// 对SQLite数据库执行增删改操作,返回受影响的行数。 /// /// 要执行的增删改的SQL语句。 /// 执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。 /// /// public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters) { int affectedRows = 0; using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand command = new SQLiteCommand(connection)) { try { connection.Open(); command.CommandText = sql; if (parameters.Length != 0) { command.Parameters.AddRange(parameters); } affectedRows = command.ExecuteNonQuery(); } catch (Exception) { throw; } } } return affectedRows; } public int ExecuteNonQueryForTransaction(SQLiteCommand command ,string sql, params SQLiteParameter[] parameters) { int affectedRows = 0; command.CommandText = sql; if (parameters.Length != 0) { command.Parameters.AddRange(parameters); } affectedRows = command.ExecuteNonQuery(); return affectedRows; } /// /// 单独修改指定位置的能谱数据 /// /// /// /// /// public bool ExecuteXrayForTransaction(int XrayId, int FieldId, byte[] pBlobData) { //cmdForTrans.CommandText = "UPDATE XRayData SET XRayData = @XRayData WHERE XrayIndex = " + XrayId + " and FieldId = " + FieldId + ""; cmdForTrans.CommandText = "INSERT INTO XRayData(XrayIndex, FieldId, XRayData) VALUES (" + XrayId + "," + FieldId + ",@XRayData)"; cmdForTrans.Parameters.Clear(); cmdForTrans.Parameters.AddWithValue(@"XRayData", pBlobData); if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } return true; } /// /// 修改元素信息 /// /// /// /// /// /// /// public bool ExecuteElementForTransaction(int XrayId, int FieldId, int ElementNum, List nameList, List perList) { for (int i = 0; i < ElementNum; i++) { cmdForTrans.CommandText = "INSERT INTO ElementChemistry(XrayID, FieldID, ElementId, ElementNum, Name, Percentage) VALUES ('" + XrayId + "','" + FieldId + "','" + i + "','" + ElementNum + "','" + nameList[i] + "','" + perList[i] + "')"; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } } return true; } /// /// 修改segment信息 /// /// /// /// /// public bool ExecuteSegmentForTransaction(int XrayId, int FieldId, List SegmentList) { cmdForTrans.CommandText = "DELETE FROM Segment WHERE XRayId = " + XrayId + " AND FieldId = " + FieldId + ""; for (int i = 0; i < SegmentList.Count; i++) { cmdForTrans.CommandText = "INSERT INTO Segment(XrayID, FieldID, SegmentId, SegmentNum, Start, Height, Length, ParticleId) VALUES ('" + XrayId + "','" + FieldId + "','" + i + "','" + SegmentList[0].SegmentNum + "','" + SegmentList[i].Start + "','" + SegmentList[i].Height + "','" + SegmentList[i].Length + "','" + SegmentList[i].ParticleId + "')"; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } } return true; } /// /// 修改分类信息 /// /// public bool ExecuteIncAForTransaction(string tableName, string[] values) { //cmdForTrans.CommandText = "UPDATE IncAData SET TypeId = "+ TypeId + ", TypeName = '" + TypeName + "', TypeColor = '"+ TypeColor + "', GroupId = "+ GroupId + ", GroupName = '"+ GroupName + "', GroupColor = '"+ GroupColor + "' WHERE XrayId = " + XrayId + " and FieldId = " + FieldId + ""; cmdForTrans.CommandText = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'"; for (int i = 1; i < values.Length; i++) { cmdForTrans.CommandText += ", " + "'" + values[i] + "'"; } cmdForTrans.CommandText += " )"; //cmdForTrans.CommandText = "UPDATE IncAData SET TypeId = "+ TypeId + ", TypeName = '" + TypeName + "', TypeColor = '"+ TypeColor + "', GroupId = "+ GroupId + ", GroupName = '"+ GroupName + "', GroupColor = '"+ GroupColor + "' WHERE XrayId = " + XrayId + " and FieldId = " + FieldId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } return true; } #region 颗粒分割部分 public int ExecuteNewPartIdForTransaction() { DataTable dt = ExecuteQuery("SELECT MAX(XrayId) FROM IncAData"); if (dt.Rows.Count == 0) { return 0; } return int.Parse(dt.Rows[0][0].ToString()); } public bool ExecuteSegmentForTransaction(Particle particle1, Particle particle2, int SegmentId) { cmdForTrans.CommandText = "DELETE FROM Segment WHERE XRayId = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } for (int i = 0; i < particle1.SegmentNum; i++) { cmdForTrans.CommandText = "INSERT INTO Segment(XrayID, FieldID, SegmentId, SegmentNum, Start, Height, Length, ParticleId) VALUES ('" + particle1.SegmentList[0].XRayId + "','" + particle1.SegmentList[0].FieldId + "','" + i + "','" + particle1.SegmentList[0].SegmentNum + "','" + particle1.SegmentList[i].Start + "','" + particle1.SegmentList[i].Height + "','" + particle1.SegmentList[i].Length + "','" + particle1.SegmentList[i].ParticleId + "')"; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } } for (int i = 0; i < particle2.SegmentNum; i++) { cmdForTrans.CommandText = "INSERT INTO Segment(XrayID, FieldID, SegmentId, SegmentNum, Start, Height, Length, ParticleId) VALUES ('" + SegmentId + "','" + particle2.SegmentList[0].FieldId + "','" + i + "','" + particle2.SegmentList[0].SegmentNum + "','" + particle2.SegmentList[i].Start + "','" + particle2.SegmentList[i].Height + "','" + particle2.SegmentList[i].Length + "','" + SegmentId + "')"; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } } return true; } public bool ExecuteXrayForTransaction(Particle particle1, Particle particle2, int SegmentId) { //XRayData cmdForTrans.CommandText = "INSERT INTO XRayData(XrayIndex, FieldId, XrayData) SELECT " + SegmentId + ", FieldId, XrayData FROM XRayData WHERE FieldId = "+ particle1.SegmentList[0].FieldId + " AND XrayIndex = "+ particle1.SegmentList[0].XRayId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } //PosXrayInfo cmdForTrans.CommandText = "UPDATE PosXrayInfo SET PosX = "+ particle1.PosX + ", PosY = "+ particle1.PosY + " WHERE XrayIndex = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } cmdForTrans.CommandText = "INSERT INTO PosXrayInfo(XrayIndex, PosX, PosY, FieldId, ParticleId, FeatureId, ElementNum) SELECT " + SegmentId + ", "+ particle2.PosX + ", "+ particle2.PosY + ", FieldId, ParticleId, FeatureId, ElementNum FROM PosXrayInfo WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XrayIndex = " + particle1.SegmentList[0].XRayId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } //ElementChemistry cmdForTrans.CommandText = "INSERT INTO ElementChemistry(XRayId, FieldId, ElementId, ElementNum, Name, Percentage) SELECT " + SegmentId + ", FieldId, ElementId, ElementNum, Name, Percentage FROM ElementChemistry WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XRayId = " + particle1.SegmentList[0].XRayId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } return true; } public bool ExecuteIncAForTransaction(Particle particle1, Particle particle2, int SegmentId) { cmdForTrans.CommandText = "UPDATE IncAData SET AveGray = " + particle1.AveGray + ", RectLeft = " + particle1.RectLeft + ", RectTop = " + particle1.RectTop + ", RectWidth = " + particle1.RectWidth + ", RectHeight = " + particle1.RectHeight + ", Area = " + particle1.Area + ", PosX = " + particle1.PosX + ", PosY = " + particle1.PosY + ", DFERET = " + particle1.DFERET + ", SegmentNum = " + particle1.SegmentNum + ", ParticleId = " + particle1.ParticleId + ", DMAX = " + particle1.DMAX + ", DMIN = " + particle1.DMIN + ", DPERP = " + particle1.DPERP + ", PERIMETER = " + particle1.PERIMETER + ", ORIENTATION = " + particle1.ORIENTATION + ", DINSCR = " + particle1.DINSCR + ", DMEAN = " + particle1.DMEAN + ", DELONG = " + particle1.DELONG + " WHERE XrayId = " + particle1.SegmentList[0].XRayId + " AND FieldId = " + particle1.SegmentList[0].FieldId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } cmdForTrans.CommandText = "INSERT INTO IncAData(FieldId, XrayId, AveGray, RectLeft, RectTop, RectWidth, RectHeight, Area, PosX, PosY, DFERET, SegmentNum, FieldPosX, FieldPosY, ParticleId, DMAX, DMIN, DPERP, PERIMETER, ORIENTATION, DINSCR, DMEAN, DELONG, TypeId, TypeName, TypeColor, SEMPosX, SEMPosY, GroupId, GroupName, GroupColor) SELECT FieldId, " + SegmentId + ", " + particle2.AveGray + ", " + particle2.RectLeft + ", " + particle2.RectTop + ", " + particle2.RectWidth + ", " + particle2.RectHeight + ", " + particle2.Area + ", " + particle2.PosX + ", " + particle2.PosY + ", " + particle2.DFERET + ", " + particle2.SegmentNum + ", FieldPosX, FieldPosY," + SegmentId + ", " + particle2.DMAX + ", " + particle2.DMIN + ", " + particle2.DPERP + ", " + particle2.PERIMETER + ", " + particle2.ORIENTATION + ", " + particle2.DINSCR + ", " + particle2.DMEAN + ", " + particle2.DELONG + ", TypeId, TypeName, TypeColor, SEMPosX, SEMPosY, GroupId, GroupName, GroupColor FROM IncAData WHERE FieldId = " + particle1.SegmentList[0].FieldId + " AND XrayId = " + particle1.SegmentList[0].XRayId + ""; if (cmdForTrans.ExecuteNonQuery() == 0) { return false; } return true; } #endregion public bool BeginTransaction() { if (connForTrans.State != ConnectionState.Open) { connForTrans.Open(); } trans = connForTrans.BeginTransaction(); cmdForTrans = new SQLiteCommand(); cmdForTrans.Connection = connForTrans; cmdForTrans.Transaction = trans; return true; } public bool CommitTransaction() { trans.Commit(); connForTrans.Close(); return true; } /// /// 批量处理数据操作语句。 /// /// SQL语句集合。 /// public void ExecuteNonQueryBatch(ref List> list) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { try { conn.Open(); } catch { throw; } SQLiteCommand cmd1 =conn.CreateCommand(); cmd1.CommandText = "pragma synchronous = 0;"; cmd1.ExecuteNonQuery(); using (SQLiteTransaction tran = conn.BeginTransaction()) { using (SQLiteCommand cmd = new SQLiteCommand(conn)) { try { foreach (var item in list) { cmd.CommandText = item.Key; if (item.Value != null) { cmd.Parameters.AddRange(item.Value); } cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } tran.Commit(); } catch (Exception ex) { tran.Rollback(); log.Error(ex.ToString()); } } } } } /// /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例。 /// /// 要执行的查询语句。 /// 执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准。 /// /// public SQLiteDataReader ExecuteReader(string sql, params SQLiteParameter[] parameters) { SQLiteConnection connection = new SQLiteConnection(connectionString); SQLiteCommand command = new SQLiteCommand(sql, connection); try { if (parameters.Length != 0) { command.Parameters.AddRange(parameters); } connection.Open(); return command.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception) { throw; } } /// /// 执行查询语句,并返回第一个结果。 /// /// 查询语句。 /// 查询结果。 /// public object ExecuteScalar(string sql, params SQLiteParameter[] parameters) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand(conn)) { try { conn.Open(); cmd.CommandText = sql; if (parameters.Length != 0) { cmd.Parameters.AddRange(parameters); } return cmd.ExecuteScalar(); } catch (Exception) { throw; } } } } /// /// 读取整张数据表 /// /// The full table. /// 数据表名称 public DataTable ReadFullTable(string tableName,string order) { string queryString = "SELECT * FROM " + tableName+" order by "+ order; return ExecuteQuery(queryString); } /// /// /// 执行一个查询语句,返回一个包含查询结果的DataTable /// /// /// /// 要执行的查询语句 /// /// 执行查询语句的参数 /// /// public DataTable ExecuteDataTable(string sql, params SQLiteParameter[] parameters) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { using (SQLiteCommand command = new SQLiteCommand(sql, conn)) { if (parameters != null) { command.Parameters.AddRange(parameters); } SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); DataTable data = new DataTable(); adapter.Fill(data); return data; } } } /// /// /// tbale转list /// /// /// /// /// /// public List TableToList(DataTable table) where T : class, new() { var result = new List(); var propertys = typeof(T).GetProperties(); foreach (DataRow dr in table.Rows) { var item = new T(); result.Add(item); foreach (var pi in propertys) { if (!table.Columns.Contains(pi.Name)) continue; var value = dr[pi.Name]; if (value is DBNull || value == null) continue; if (value.GetType().ToString() == "System.Int64") { pi.SetValue(item, Convert.ToInt32(value)); } else { pi.SetValue(item, value); } } } return result; } /// /// /// tbale转list /// /// /// /// /// /// public List RowsToList(DataRow[] table) where T : class, new() { var result = new List(); var propertys = typeof(T).GetProperties(); foreach (DataRow dr in table) { var item = new T(); result.Add(item); foreach (var pi in propertys) { if (!dr.Table.Columns.Contains(pi.Name)) continue; var value = dr[pi.Name]; if (value is DBNull || value == null) continue; if (value.GetType().ToString() == "System.Int64") { pi.SetValue(item, Convert.ToInt32(value)); } else { pi.SetValue(item, value); } } } return result; } /// /// 向指定数据表中插入数据 /// /// The values. /// 数据表名称 /// 插入的数值 public DataTable InsertValues(string tableName, string[] values) { //获取数据表中字段数目 int fieldCount = ReadFullTable(tableName,"").Columns.Count; //当插入的数据长度不等于字段数目时引发异常 if (values.Length != fieldCount) { throw new SQLiteException("values.Length!=fieldCount"); } string queryString = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'"; for (int i = 1; i < values.Length; i++) { queryString += ", " + "'" + values[i] + "'"; } queryString += " )"; return ExecuteQuery(queryString); } /// /// 更新指定数据表内的数据 /// /// The values. /// 数据表名称 /// 字段名 /// 字段名对应的数据 /// 关键字 /// 关键字对应的值 /// 运算符:=,<,>,...,默认“=” public DataTable UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string value, string operation = "=") { //当字段名称和字段数值不对应时引发异常 if (colNames.Length != colValues.Length) { throw new SQLiteException("colNames.Length!=colValues.Length"); } string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'"; for (int i = 1; i < colValues.Length; i++) { queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'"; } queryString += " WHERE " + key + operation + "'" + value + "'"; return ExecuteQuery(queryString); } /// /// 删除指定数据表内的数据 /// /// The values. /// 数据表名称 /// 字段名 /// 字段名对应的数据 public DataTable DeleteValuesOR(string tableName, string[] colNames, string[] colValues, string[] operations) { //当字段名称和字段数值不对应时引发异常 if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length) { throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length"); } string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'"; for (int i = 1; i < colValues.Length; i++) { queryString += "OR " + colNames[i] + operations[0] + "'" + colValues[i] + "'"; } return ExecuteQuery(queryString); } /// /// 删除指定数据表内的数据 /// /// The values. /// 数据表名称 /// 字段名 /// 字段名对应的数据 public DataTable DeleteValuesAND(string tableName, string[] colNames, string[] colValues, string[] operations) { //当字段名称和字段数值不对应时引发异常 if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length) { throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length"); } string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'"; for (int i = 1; i < colValues.Length; i++) { queryString += " AND " + colNames[i] + operations[i] + "'" + colValues[i] + "'"; } return ExecuteQuery(queryString); } /// /// 创建数据表 /// + /// The table. /// 数据表名 /// 字段名 /// 字段名类型 public int CreateTable(TableModel table) { StringBuilder builder = new StringBuilder(); builder.Append("CREATE TABLE IF NOT EXISTS " + table.TableName+"("); int ind = 0; foreach (var item in table.columns) { builder.Append(item.ColumName + " " + item.ColumType + " " + (item.IsPrimarykey ? "PRIMARY KEY" : "")); if (++ind == table.columns.Count) { builder.Append(")"); } else { builder.Append(","); } } return ExecuteNonQuery(builder.ToString()); } /// /// 判断表存在 /// /// /// public bool IsExist(string tableName) { string queryString = "select count(*) from sqlite_master where [type]='table' and [name]='"+ tableName + "'" ; Int64 i = (Int64)ExecuteScalar(queryString); return i > 0 ? true : false; } /// /// 删除数据库表 /// /// /// public bool DeleteTable(string tableName) { string queryString = "drop table " + tableName; return ExecuteNonQuery(queryString)>0?true:false; } /// /// 删除数据库表数据 /// /// /// public bool RemoveAllRows(string tableName) { string queryString = "DELETE FROM " + tableName; return ExecuteNonQuery(queryString) > 0 ? true : false; } /// /// Reads the table. /// /// The table. /// Table name. /// Items. /// Col names. /// Operations. /// Col values. public DataTable ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues) { string queryString = "SELECT " + items[0]; for (int i = 1; i < items.Length; i++) { queryString += ", " + items[i]; } queryString += " FROM " + tableName + " where 1=1"; //+ " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0]; for (int i = 0; i < colNames.Length; i++) { queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " "; } return ExecuteQuery(queryString); } /// /// 获取关键元素列表 /// /// 表名 /// 字段名 /// public List GetDBKeyElementList(string tableName, string eleName) { string queryString = "SELECT "+ eleName + " FROM " + tableName; DataTable dt = ExecuteQuery(queryString); List nameList = new List(); for (int i = 0; i < dt.Rows.Count; i++) { string str_name = dt.Rows[i][eleName].ToString(); if (str_name != "") { if (str_name.Contains(",")) { for (int j = 0; j < str_name.Split(',').Length; j++) { if (!nameList.Contains(str_name.Split(',')[j])) { nameList.Add(str_name.Split(',')[j]); } } } else { if (!nameList.Contains(str_name)) { nameList.Add(str_name); } } } } return nameList; } } }