using PLCBaseFunction; using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace DAL { public class SQLHelper { //private static SqlConnection conn = null; //private static SqlCommand cmd = null; //private static SqlDataReader sdr = null; public static string connStr = ""; public static int iFlag = 0; private static SqlConnection GetConn() { var conn = new SqlConnection(connStr); if (conn.State == ConnectionState.Closed) { try { conn.Open(); } catch (Exception ex) { if (iFlag == 0) { iFlag++;//必须放在前面,这样才起左右,放在后面,不会赋值 如果不点击确定的话 MyBase.TraceWriteLine(" 数据库打开连接失败" + ex.ToString()); MessageBox.Show("数据库打开连接失败,请检查数据库是否正确连接!原因:" + ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } return conn; } } return conn; } #region 执行不带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 /// /// 执行不带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 /// /// 增删改SQL语句或存储过程 /// 命令类型 /// 返回受影响的行数 //public static int ExecuteNonQuery(string cmdText, CommandType ct) //{ // int res = 0; // try // { // var cmd = new SqlCommand(cmdText, GetConn()); // cmd.CommandType = ct; // res = cmd.ExecuteNonQuery(); //返回受影响的行数 // } // catch (Exception ex) // { // throw ex; // } // finally // { // if (conn.State == ConnectionState.Open) // { // conn.Close(); // } // } // return res; //} public static int ExecuteNonQuery(string cmdText, CommandType ct) { int res = 0; try { using (var conn = GetConn()) using (var cmd = new SqlCommand(cmdText, conn)) { cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); // 返回受影响的行数 } } catch (Exception ex) { MyBase.TraceWriteLine("ExecuteNonQuery异常: " + ex.ToString()); throw; // 建议让上层处理异常 } return res; } #endregion 执行不带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 #region 执行带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 /// /// 执行带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 /// /// 增删改SQL语句或存储过程 /// 命令类型 /// 返回受影响的行数 public static int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct) { int res = 0; using (var cmd = new SqlCommand(cmdText, GetConn())) { cmd.CommandType = ct; cmd.Parameters.AddRange(paras); res = cmd.ExecuteNonQuery(); } return res; } #endregion 执行带参数的增删改SQL语句或存储过程 返回int类型 返回受影响的行数 #region 执行不带参数的查询SQL语句或存储过程 返回DataTable类型 /// /// 执行不带参数的查询SQL语句或存储过程 返回DataTable类型 /// /// 查询SQL语句或存储过程 /// 命令类型 /// DataTable型 public static DataTable ExecuteQuery(string cmdText, CommandType ct) { DataTable dt = new DataTable(); var cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; //cmd.CommandTimeout = 60; using (var sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } #endregion 执行不带参数的查询SQL语句或存储过程 返回DataTable类型 #region 执行带参数的查询SQL语句或存储过程 返回DataTable类型 /// /// 执行带参数的查询SQL语句或存储过程 返回DataTable类型 /// /// 查询SQL语句或存储过程 /// 参数集合 /// 命令类型 /// DataTable型 public static DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { DataTable dt = new DataTable(); var cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; cmd.Parameters.AddRange(paras); using (var sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } #endregion 执行带参数的查询SQL语句或存储过程 返回DataTable类型 /// /// 执行SQL语句并返回DataSet /// /// SQL语句 /// public static DataSet ExecuteDs(String Sqlstr) { using (SqlDataAdapter da = new SqlDataAdapter(Sqlstr, GetConn())) { DataSet ds = new DataSet(); da.Fill(ds); return ds; } } /// /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值) /// /// 数据库连接 /// 存储过程名 /// 存储过程参数 /// SqlCommand private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, SqlParameter[] parameters) { SqlCommand command = new SqlCommand(storedProcName, connection); command.CommandType = CommandType.StoredProcedure; foreach (SqlParameter parameter in parameters) { if (parameter != null) { // 检查未分配值的输出参数,将其分配以DBNull.Value. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } command.Parameters.Add(parameter); } } return command; } /// /// 执行存储过程 /// /// 存储过程名 /// 存储过程参数 /// DataSet结果中的表名 /// DataSet public static DataSet RunProcedure(string storedProcName, SqlParameter[] parameters, string tableName) { using (SqlConnection connection = new SqlConnection(connStr)) { DataSet dataSet = new DataSet(); connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); sqlDA.Fill(dataSet, tableName); connection.Close(); return dataSet; } } #region 使用SqlBulkCopy插入测量数据 /// /// 要插入的数据表的结构,与函数内部定义的映射表要一模一样 /// /// 要插入的数据表 public static int InsertMeasureDataToDB(DataTable InsertDT) { int iResult = 1; using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GetConn())) { try { bulkCopy.DestinationTableName = "TMeasureData";//要插入的表的表明,创造映射关系,比下面的直接写表名称 更加灵活 bulkCopy.ColumnMappings.Add("CarID", "CarID");//映射字段名 DataTable列名 ,数据库 对应的列名 bulkCopy.ColumnMappings.Add("CarType", "CarType");//映射字段名 DataTable列名 ,数据库 对应的列名 bulkCopy.ColumnMappings.Add("MeasPointName", "MeasPointName"); bulkCopy.ColumnMappings.Add("DimensionName", "DimensionName"); bulkCopy.ColumnMappings.Add("NormalValue", "NormalValue"); bulkCopy.ColumnMappings.Add("LowerTolVal", "LowerTolVal"); bulkCopy.ColumnMappings.Add("UpperTolVal", "UpperTolVal"); bulkCopy.ColumnMappings.Add("MeasureValue", "MeasureValue"); bulkCopy.ColumnMappings.Add("MeasureItemResult", "MeasureItemResult"); bulkCopy.ColumnMappings.Add("MeasureDate", "MeasureDate"); bulkCopy.ColumnMappings.Add("Remark", "Remark"); bulkCopy.WriteToServer(InsertDT); } catch (Exception ex) { MessageBox.Show("批量插入测量数据到数据库失败!原因:" + ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); iResult = -1; } } return iResult; } /// /// 要插入的数据表的结构,与函数内部定义的映射表要一模一样 /// /// 要插入的数据表 public static int InsertRangeDataToDB(DataTable InsertDT) { int iResult = 1; using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GetConn())) { try { bulkCopy.DestinationTableName = "TRangeData";//要插入的表的表明,创造映射关系,比下面的直接写表名称 更加灵活 bulkCopy.ColumnMappings.Add("CarID", "CarID");//映射字段名 DataTable列名 ,数据库 对应的列名 bulkCopy.ColumnMappings.Add("RangeName", "RangeName");//映射字段名 DataTable列名 ,数据库 对应的列名 bulkCopy.ColumnMappings.Add("RangeValue", "RangeValue"); bulkCopy.ColumnMappings.Add("RangeLowUpp", "RangeLowUpp"); bulkCopy.ColumnMappings.Add("Result", "Result"); bulkCopy.ColumnMappings.Add("CreateTime", "CreateTime"); bulkCopy.ColumnMappings.Add("Remark", "Remark"); bulkCopy.WriteToServer(InsertDT); } catch (Exception ex) { MessageBox.Show("批量插入RangeData数据到数据库失败!原因:" + ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); iResult = -1; } } return iResult; } #endregion 使用SqlBulkCopy插入测量数据 #region 使用SqlBulkCopy插入批量数据方法 /// /// 要插入的数据表的结构,与函数内部定义的映射表要一模一样 /// /// 要插入的数据表 public static void TWorkpieceListToSQLServer(DataTable InsertDT) { using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GetConn())) { try { bulkCopy.DestinationTableName = "TWorkpieceList";//要插入的表的表明,创造映射关系,比下面的直接写表名称 更加灵活 bulkCopy.ColumnMappings.Add("WorkpieceID", "WorkpieceID");//映射字段名 DataTable列名 ,数据库 对应的列名 bulkCopy.ColumnMappings.Add("DrawerID", "DrawerID"); bulkCopy.ColumnMappings.Add("WorkpieceType", "WorkpieceType"); bulkCopy.ColumnMappings.Add("TrayType", "TrayType"); bulkCopy.ColumnMappings.Add("WorkpieceStatus", "WorkpieceStatus"); bulkCopy.ColumnMappings.Add("WorkpiecePos", "WorkpiecePos"); bulkCopy.WriteToServer(InsertDT); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { // Close the SqlDataReader. The SqlBulkCopy // object is automatically closed at the end // of the using block. } } } #endregion 使用SqlBulkCopy插入批量数据方法 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中,用此函数,创建的InsertDataTable类型必须跟数据库中的类型,列数一模一样 /// /// 数据库中对应的表名 /// 数据集 public static void SqlBulkCopyInsert(string strDBTableName, DataTable InsertDataTable) { try { using (SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(GetConn()))//引用SqlBulkCopy { sqlRevdBulkCopy.DestinationTableName = strDBTableName;//数据库中对应的表名 sqlRevdBulkCopy.NotifyAfter = InsertDataTable.Rows.Count;//有几行数据 sqlRevdBulkCopy.WriteToServer(InsertDataTable);//数据导入数据库 sqlRevdBulkCopy.Close();//关闭连接 } } catch (Exception ex) { Console.WriteLine("数据库处理出错,SqlBulkCopyInsert,原因:" + ex.Message); throw (ex); } } #endregion 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 } }