框架:.NET core 5.0
驱动包:Oracle.ManagedDataAccess.Core
代码:
using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CP_Demo.DAL { /// <summary> /// 数据库操作类 /// </summary> public class DbHelp { private OracleCommand cmd = null; private OracleConnection conn = null; private string connstr = "User Id=sgylmes;Password=sgyl2019mes1314;Data Source=10.196.200.20:1521/orcl;"; //private string connstr = "Data Source=(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.196.200.20)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME =ORCL) ));User ID=sgylmes;Password=sgyl2019mes1314;"; private static string connString = "User Id=sgylmes;Password=sgyl2019mes1314;Data Source=10.196.200.20:1521/orcl;"; //private Common common = new Common(); private OracleTransaction transaction; private static DbHelp instance; private static readonly object objlock = new object(); public static DbHelp GetDbHelpInstance() { //if (instance == null) //{ // lock (objlock) // { // if (instance == null) // { // instance = new DbHelp(); // } // } //} //return instance; return new DbHelp(); } #region 构造 private DbHelp() { } #endregion #region 建立数据库连接对象 /// <summary> /// 建立数据库连接 /// </summary> /// <returns>返回一个数据库的连接OracleConnection对象</returns> public OracleConnection init(string connStr) { try { if (transaction != null && conn != null) return conn; if (string.IsNullOrEmpty(connStr)) { connStr = "connStr"; } if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); } //if (conn != null) //{ // conn.Close(); //} conn = new OracleConnection(connstr); if (conn.State != ConnectionState.Open) { conn.Open(); } if (conn == null) { string str = ""; } } catch (Exception e) { throw new Exception(e.Message.ToString()); } return conn; } #endregion #region 设置OracleCommand对象 /// <summary> /// 设置OracleCommand对象 /// </summary> /// <param name="cmd">OracleCommand对象 </param> /// <param name="cmdText">命令文本</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdParms">参数集合</param> private void SetCommand(OracleCommand cmd, string cmdText, CommandType cmdType, OracleParameter[] cmdParms) { cmd.Connection = conn; cmd.CommandText = cmdText; cmd.CommandType = cmdType; if (cmdParms != null) { cmd.Parameters.AddRange(cmdParms); } } #endregion #region 执行相应的sql语句,返回相应的DataSet对象 /// <summary> /// 执行相应的sql语句,返回相应的DataSet对象 /// </summary> /// <param name="sqlstr">sql语句</param> /// <returns>返回相应的DataSet对象</returns> public DataSet GetDataSet(string sqlstr, string connStr) { DataSet set = new DataSet(); try { init(connStr); OracleDataAdapter adp = new OracleDataAdapter(sqlstr, conn); adp.Fill(set, "DefaultTable"); //conn.Close(); } catch (Exception e) { //conn.Close(); throw new Exception(e.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return set; } #endregion #region 执行相应的sql语句,返回相应的DataSet对象 /// <summary> /// 执行相应的sql语句,返回相应的DataSet对象 /// </summary> /// <param name="sqlstr">sql语句</param> /// <param name="tableName">表名</param> /// <returns>返回相应的DataSet对象</returns> public DataSet GetDataSet(string sqlstr, string tableName, string connStr) { DataSet set = new DataSet(); try { init(connStr); OracleDataAdapter adp = new OracleDataAdapter(sqlstr, conn); adp.Fill(set, tableName); //conn.Close(); } catch (Exception e) { //conn.Close(); throw new Exception(e.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return set; } #endregion #region 执行不带参数sql语句,返回所影响的行数 /// <summary> /// 执行不带参数sql语句,返回所影响的行数 /// </summary> /// <param name="cmdstr">增,删,改sql语句</param> /// <returns>返回所影响的行数</returns> public int ExecuteNonQuery(string cmdText, string connStr) { int count; try { init(connStr); cmd = new OracleCommand(cmdText, conn); count = cmd.ExecuteNonQuery(); //conn.Close(); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return count; } #endregion #region 执行带参数sql语句或存储过程,返回所影响的行数 /// <summary> /// 执行带参数sql语句或存储过程,返回所影响的行数 /// </summary> /// <param name="cmdText">带参数的sql语句和存储过程名</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdParms">参数集合</param> /// <returns>返回所影响的行数</returns> public int ExecuteNonQuery(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms) { int count; try { init(connStr); cmd = new OracleCommand(); SetCommand(cmd, cmdText, cmdType, cmdParms); count = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); //conn.Close(); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return count; } #endregion #region 执行不带参数sql语句,返回一个从数据源读取数据的OracleDataReader对象 /// <summary> /// 执行不带参数sql语句,返回一个从数据源读取数据的OracleDataReader对象 /// </summary> /// <param name="cmdstr">相应的sql语句</param> /// <returns>返回一个从数据源读取数据的OracleDataReader对象</returns> public OracleDataReader ExecuteReader(string cmdText, string connStr) { OracleDataReader reader; try { init(connStr); cmd = new OracleCommand(cmdText, conn); reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return reader; } #endregion #region 执行带参数的sql语句或存储过程,返回一个从数据源读取数据的OracleDataReader对象 /// <summary> /// 执行带参数的sql语句或存储过程,返回一个从数据源读取数据的OracleDataReader对象 /// </summary> /// <param name="cmdText">sql语句或存储过程名</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdParms">参数集合</param> /// <returns>返回一个从数据源读取数据的OracleDataReader对象</returns> public OracleDataReader ExecuteReader(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms) { OracleDataReader reader; try { init(connStr); cmd = new OracleCommand(); SetCommand(cmd, cmdText, cmdType, cmdParms); reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return reader; } #endregion #region 执行不带参数sql语句,返回结果集首行首列的值object /// <summary> /// 执行不带参数sql语句,返回结果集首行首列的值object /// </summary> /// <param name="cmdstr">相应的sql语句</param> /// <returns>返回结果集首行首列的值object</returns> public object ExecuteScalar(string cmdText, string connStr) { object obj; try { init(connStr); cmd = new OracleCommand(cmdText, conn); obj = cmd.ExecuteScalar(); //conn.Close(); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return obj; } #endregion #region 执行带参数sql语句或存储过程,返回结果集首行首列的值object /// <summary> /// 执行带参数sql语句或存储过程,返回结果集首行首列的值object /// </summary> /// <param name="cmdText">sql语句或存储过程名</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdParms">返回结果集首行首列的值object</param> /// <returns></returns> public object ExecuteScalar(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms) { object obj; try { init(connStr); cmd = new OracleCommand(); SetCommand(cmd, cmdText, cmdType, cmdParms); obj = cmd.ExecuteScalar(); //conn.Close(); } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return obj; } #endregion #region 批量插入数据 /// <summary> /// 批量插入数据 /// </summary> /// <param name="tableName">表名称</param> /// <param name="columnRowData">键-值存储的批量数据:键是列名称,值是对应的数据集合</param> /// <param name="len">每次批处理数据的大小</param> /// <returns></returns> public string BatchInsert(string tableName, Dictionary<string, object> columnRowData, int len, string connStr) { if (string.IsNullOrEmpty(tableName)) { return "FALSE:表名不能为空"; } if (columnRowData == null || columnRowData.Count < 1) { return "FALSE:字段名称不能为空"; } if (string.IsNullOrEmpty(connStr)) { connStr = "connStr"; } string sResult = "FALSE"; string[] dbColumns = columnRowData.Keys.ToArray(); StringBuilder sbCmdText = new StringBuilder(); if (columnRowData.Count > 0) { //准备插入的SQL sbCmdText.AppendFormat("INSERT INTO {0}(", tableName); sbCmdText.Append(string.Join(",", dbColumns)); sbCmdText.Append(") VALUES ("); sbCmdText.Append(":" + string.Join(",:", dbColumns)); sbCmdText.Append(")"); using (OracleConnection conn = new OracleConnection(connstr))//(ConfigurationManager.ConnectionStrings[connStr].ConnectionString)) { using (OracleCommand cmd = conn.CreateCommand()) { //绑定批处理的行数 cmd.ArrayBindCount = len; cmd.BindByName = true; cmd.CommandType = CommandType.Text; cmd.CommandText = sbCmdText.ToString(); cmd.CommandTimeout = 600; //创建参数 OracleParameter oraParam; OracleDbType dbType = OracleDbType.Varchar2; foreach (string colName in dbColumns) { dbType = GetOracleDbType(columnRowData[colName]); oraParam = new OracleParameter(colName, dbType); oraParam.Direction = ParameterDirection.Input; oraParam.OracleDbType = dbType; oraParam.Value = columnRowData[colName]; cmd.Parameters.Add(oraParam); } //打开连接 conn.Open(); /*执行批处理*/ var trans = conn.BeginTransaction(); try { cmd.Transaction = trans; if (cmd.ExecuteNonQuery() > 0) { sResult = "TRUE"; } trans.Commit(); } catch (Exception ex) { trans.Rollback(); sResult = ex.Message; } finally { if (conn != null) { conn.Close(); conn.Dispose(); } } } } } return sResult; } #endregion #region 根据数据类型获取OracleDbType /// <summary> /// 根据数据类型获取OracleDbType /// </summary> /// <param name="value"></param> /// <returns></returns> private OracleDbType GetOracleDbType(object value) { OracleDbType dataType = OracleDbType.Varchar2; if (value is string[]) { dataType = OracleDbType.Varchar2; } else if (value is DateTime[]) { dataType = OracleDbType.TimeStamp; } else if (value is int[] || value is short[]) { dataType = OracleDbType.Int32; } else if (value is long[]) { dataType = OracleDbType.Int64; } else if (value is decimal[] || value is double[] || value is float[]) { dataType = OracleDbType.Decimal; } else if (value is Guid[]) { dataType = OracleDbType.Varchar2; } else if (value is bool[] || value is Boolean[]) { dataType = OracleDbType.Byte; } else if (value is byte[]) { dataType = OracleDbType.Blob; } else if (value is char[]) { dataType = OracleDbType.Char; } return dataType; } /// <summary> /// 通过类型进行转换 /// </summary> /// <param name="type"></param> /// <returns></returns> public OracleDbType GetOracleDbType(Type type) { OracleDbType dataType = OracleDbType.Varchar2; if (type == typeof(String)) { dataType = OracleDbType.Varchar2; } else if (type == typeof(DateTime)) { dataType = OracleDbType.Date; } else if (type == typeof(int) || type == typeof(short)) { dataType = OracleDbType.Int32; } else if (type == typeof(long)) { dataType = OracleDbType.Int64; } else if (type == typeof(Decimal) || type == typeof(Double) || type == typeof(float)) { dataType = OracleDbType.Decimal; } else if (type == typeof(Guid)) { dataType = OracleDbType.Varchar2; } else if (type == typeof(bool) || type == typeof(Boolean)) { dataType = OracleDbType.Byte; } else if (type == typeof(byte)) { dataType = OracleDbType.Blob; } else if (type == typeof(char)) { dataType = OracleDbType.Char; } return dataType; } #endregion public string BatchInsert(string tableName, Dictionary<string, object> columnRowData, int len) { if (string.IsNullOrEmpty(tableName)) { return "FALSE:表名不能为空"; } if ((columnRowData == null) || (columnRowData.Count < 1)) { return "FALSE:字段名称不能为空"; } string sMsg = "FALSE"; string[] strArray = columnRowData.Keys.ToArray<string>(); StringBuilder builder = new StringBuilder(); if (columnRowData.Count > 0) { builder.AppendFormat("INSERT INTO {0}(", tableName); builder.Append(string.Join(",", strArray)); builder.Append(") VALUES ("); builder.Append(":" + string.Join(",:", strArray)); builder.Append(")"); using (OracleConnection connection = new OracleConnection(this.connstr)) { using (OracleCommand command = connection.CreateCommand()) { command.ArrayBindCount = len; command.BindByName = true; command.CommandType = CommandType.Text; command.CommandText = builder.ToString(); command.CommandTimeout = 600; OracleDbType oraType = OracleDbType.Varchar2; foreach (string str2 in strArray) { oraType = this.GetOracleDbType(columnRowData[str2]); OracleParameter param = new OracleParameter(str2, oraType); param.Direction = ParameterDirection.Input; param.OracleDbType = oraType; param.Value = columnRowData[str2]; command.Parameters.Add(param); } connection.Open(); OracleTransaction transaction = connection.BeginTransaction(); try { try { command.Transaction = transaction; if (command.ExecuteNonQuery() > 0) { sMsg = "TRUE"; } transaction.Commit(); } catch (Exception exception) { transaction.Rollback(); sMsg = exception.Message; } return sMsg; } finally { if (connection != null) { connection.Close(); connection.Dispose(); } // this.common.SaveIP("BatchInsert", sMsg); } } } } return sMsg; } #region 批量更新/新增操作 private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; cmd.BindByName = true; if (trans != null) cmd.Transaction = trans; cmd.CommandType = CommandType.Text;//cmdType; if (cmdParms != null) { foreach (OracleParameter parm in cmdParms) cmd.Parameters.Add(parm); } } /// <summary> /// 批量更新/导入底层 /// </summary> /// <param name="sql"></param> /// <param name="rownum"></param> /// <param name="cmdParms"></param> /// <returns></returns> private bool BatchImport(string sql, int rownum, params OracleParameter[] cmdParms) { using (OracleConnection connection = new OracleConnection(this.connstr)) { using (OracleCommand cmd = new OracleCommand(sql, connection)) { try { cmd.CommandType = CommandType.Text; cmd.ArrayBindCount = rownum; PrepareCommand(cmd, connection, null, sql, cmdParms); int rows = cmd.ExecuteNonQuery(); return rows >= 0 ? true : false; } catch (Oracle.ManagedDataAccess.Client.OracleException Err) { connection.Close(); connection.Dispose(); throw Err; } } } } /// <summary> /// 组建参数用 /// </summary> /// <param name="name"></param> /// <param name="oracleType"></param> /// <param name="direction"></param> /// <param name="size"></param> /// <param name="value"></param> /// <returns></returns> private OracleParameter BuildOracleParameter(string name, OracleDbType oracleType, ParameterDirection direction, int size, object value) { OracleParameter paramerer = new OracleParameter(name, value); paramerer.ParameterName = name; paramerer.OracleDbType = oracleType; paramerer.Direction = direction; if (size > 0) { paramerer.Size = size; } return paramerer; } /// <summary> /// 批量更新表 /// </summary> /// <param name="dataTable">数据表,其它表名不能为空且在系统中存在</param> /// <param name="primaryCol">更新的主键列:目前只支持单主键操作</param> /// <param name="updateCols">要更新的列:支持多个列,多个列采用英文逗号隔开</param> /// <returns></returns> public string BatchUpdate(DataTable dataTable, string primaryCol, string updateCols) { string result = "FALSE"; if (string.IsNullOrEmpty(dataTable.TableName)) { return "FALSE:表名不能为空"; } //支持多列同时更新 string[] updateColsArray = updateCols.Split(new string[] { "," }, StringSplitOptions.None); int nUpdateColCount = updateColsArray.Length; int nStep = 0; StringBuilder strBuilder = new StringBuilder(); strBuilder.AppendFormat(" update {0} set ", dataTable.TableName); foreach (string str in updateColsArray) { nStep++; if (nStep == nUpdateColCount) { strBuilder.AppendFormat(" {0} = :{0} ", str); } else { strBuilder.AppendFormat(" {0} = :{0}, ", str); } } strBuilder.AppendFormat(" where {0} = :{0}", primaryCol); string sql = strBuilder.ToString(); List<OracleParameter> listParameter = new List<OracleParameter>(); foreach (string column in updateColsArray) { DataColumn dataColumn = dataTable.Columns[column]; string columnName = dataColumn.ColumnName; //保存string List<string> listValue = new List<string>(); //保存DateTime List<DateTime> listDate = new List<DateTime>(); List<Decimal> listDouble = new List<decimal>(); List<string> listValuePk = new List<string>(); List<DateTime> listDatePk = new List<DateTime>(); List<Decimal> listDoublePk = new List<Decimal>(); Type type = dataColumn.DataType; OracleDbType dbType = GetOracleDbType(type); OracleDbType dbTypePk = GetOracleDbType(dataTable.Columns[primaryCol].DataType); foreach (DataRow dr in dataTable.Rows) { string str = dr[columnName].ToString(); if (dbType == OracleDbType.Date) { listDate.Add(string.IsNullOrEmpty(str) ? DateTime.Now : Convert.ToDateTime(str)); } else if (dbType == OracleDbType.Decimal) { listDouble.Add(string.IsNullOrEmpty(str) ? 0 : Convert.ToDecimal(str)); } else { listValue.Add(str); } string strPk = dr[primaryCol].ToString(); switch (dbTypePk) { case OracleDbType.Date: { listDatePk.Add(string.IsNullOrEmpty(strPk) ? DateTime.Now : Convert.ToDateTime(strPk)); break; } case OracleDbType.Decimal: { listDoublePk.Add(string.IsNullOrEmpty(strPk) ? 0 : Convert.ToDecimal(strPk)); break; } default: { listValuePk.Add(strPk); break; } } } //添加更新列参数 switch (dbType) { case OracleDbType.Date: { listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listDate.ToArray())); break; } case OracleDbType.Decimal: { listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listDouble.ToArray())); break; } default: { listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listValue.ToArray())); break; } } //添加主键参数 switch (dbTypePk) { case OracleDbType.Date: { listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listDatePk.ToArray())); break; } case OracleDbType.Decimal: { listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listDoublePk.ToArray())); break; } default: { listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listValuePk.ToArray())); break; } } } OracleParameter[] param = listParameter.ToArray(); param = listParameter.ToArray(); if (BatchImport(sql, dataTable.Rows.Count, param)) { result = "TRUE"; } else { result = "FALSE:批量更新失败!"; } return result; } #endregion #region 手动开启事务 /// <summary> /// 开启事务 /// </summary> public void BeginTrans(string connStr = "") { init(connStr); transaction = conn.BeginTransaction(); } /// <summary> /// 提交事务 /// </summary> public void Commit() { try { if (transaction != null) { transaction.Commit(); } } catch { } finally { if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); } } } /// <summary> /// 回滚 /// </summary> public void RollBack() { try { if (transaction != null) { transaction.Rollback(); } } catch { } finally { if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); } } } /* /// <summary> /// /// </summary> /// <param name="cmdText"></param> /// <param name="connStr"></param> /// <returns></returns> public int ExecuteNonQueryTrans(string cmdText, string connStr) { int count; try { cmd = new OracleCommand(cmdText, conn); count = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw new Exception(ex.Message.ToString()); } return count; } /// <summary> /// 执行带参数sql语句或存储过程,返回所影响的行数 /// </summary> /// <param name="cmdText">带参数的sql语句和存储过程名</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdParms">参数集合</param> /// <returns>返回所影响的行数</returns> public int ExecuteNonQueryTrans(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms) { int count; try { cmd = new OracleCommand(); SetCommand(cmd, cmdText, cmdType, cmdParms); count = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } catch (Exception ex) { throw new Exception(ex.Message.ToString()); } return count; } */ #endregion public string ExecuteNonQueryTrans(OracleConnection orclConn, string commondText, OracleTransaction trans) { string sMsg = string.Empty; using (OracleCommand command = new OracleCommand()) { command.CommandType = CommandType.Text; command.CommandText = commondText; command.CommandTimeout = 600; command.Connection = orclConn; command.Transaction = trans; try { if (command.ExecuteNonQuery() > 0) { sMsg = "TRUE"; } } catch (Exception exception) { sMsg = "FALSE:" + exception.Message; } return sMsg; } } #region /// <summary> /// 调用存储过程查询指定页码记录条数的数据 /// </summary> /// <param name="q_Sql">基本的数据查询</param> /// <param name="rowsCountPage">每页显示的记录数</param> /// <param name="indexNowPage">页码</param> /// <param name="totalRows">查询总记录数</param> /// <param name="totalPages">总页数</param> public DataTable ProcedureSelectData(string q_Sql, string connStr, int rowsCountPage, int indexNowPage, ref int totalRows, ref int totalPages) { string data = string.Empty; DataTable OutDataTable = new DataTable(); // OutDataTable = new DataTable(); DataRow dataRow; OutDataTable.TableName = "nowPageData"; OracleDataReader reader; try { init(connStr); cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "P_G_GetPagingData"; cmd.CommandType = CommandType.StoredProcedure; OracleParameter op0 = new OracleParameter("q_Sql", OracleDbType.Varchar2, 5000); OracleParameter op1 = new OracleParameter("rowCountPage", OracleDbType.Int32, 10); OracleParameter op2 = new OracleParameter("indexNowPage", OracleDbType.Int32, 10); OracleParameter op3 = new OracleParameter("totalRows", OracleDbType.Int32, 10); OracleParameter op4 = new OracleParameter("totalPages", OracleDbType.Int32, 10); OracleParameter op5 = new OracleParameter("p_corsor", OracleDbType.RefCursor); op0.Direction = ParameterDirection.Input; op1.Direction = ParameterDirection.Input; op2.Direction = ParameterDirection.Input; op3.Direction = ParameterDirection.Output; op4.Direction = ParameterDirection.Output; op5.Direction = ParameterDirection.Output; op0.Value = q_Sql.Trim(); op1.Value = rowsCountPage; op2.Value = indexNowPage; cmd.Parameters.Add(op0); cmd.Parameters.Add(op1); cmd.Parameters.Add(op2); cmd.Parameters.Add(op3); cmd.Parameters.Add(op4); cmd.Parameters.Add(op5); reader = cmd.ExecuteReader(); totalRows = Int32.Parse(op3.Value.ToString()); totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(op4.Value.ToString())));//(op4.Value.ToString()); for (int j = 0; j < reader.FieldCount; j++) { //获取列名 OutDataTable.Columns.Add(reader.GetName(j)); } //循环取数据集合中的数据,存到DataTable中 do { while (reader.Read()) { dataRow = OutDataTable.NewRow(); for (int j = 0; j < reader.FieldCount; j++) { data = reader[j].ToString(); dataRow[j] = data; } OutDataTable.Rows.Add(dataRow); } } while (reader.NextResult()); // dtTemp = OutDataTable; } catch (Exception ex) { //conn.Close(); throw new Exception(ex.Message.ToString()); } finally { if (transaction == null) { } conn.Close(); conn.Dispose(); } return OutDataTable; } #endregion } }