using Oracle.DataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace WX.CRM.DAL.Util { public class OracleDataAccessHandler { public static int BatchInsert(string tableName, DataTable dt) { OracleConnection connOracle = new OracleConnection(OracleHelper.AYCRMConn); connOracle.Open(); var trans = connOracle.BeginTransaction(); //Oracle.DataAccess.Client.OracleConnection connOracle = new Oracle.DataAccess.Client.OracleConnection(connectionString); try { string strfields = ""; string strvalues = ""; string filed = ""; string strvalue = ""; int count = 0; using (OracleDataAdapter da = new OracleDataAdapter()) { // OracleCommandBuilder ob = new OracleCommandBuilder(da); foreach (DataColumn clomn in dt.Columns) { string strfiled = clomn.ColumnName; strfields += strfiled + ","; strvalues += ":" + strfiled + ","; } if (strfields != "") { strfields = strfields.Replace('(', '_').Replace(')', ' ').TrimEnd(','); strvalues = strvalues.Replace('(', '_').Replace(')', ' ').TrimEnd(','); } da.InsertCommand = new OracleCommand(); da.InsertCommand.Transaction = trans; da.InsertCommand.Connection = connOracle; da.InsertCommand.CommandText = "INSERT INTO " + tableName + "(" + strfields + ") VALUES (" + strvalues + ")"; foreach (DataColumn clomn in dt.Columns) { filed = clomn.ColumnName; strvalue = ":" + filed; OracleParameter oparam = new OracleParameter(); oparam.ParameterName = strvalue; oparam.SourceVersion = DataRowVersion.Current; oparam.SourceColumn = filed; da.InsertCommand.Parameters.Add(oparam); } count = da.Update(dt); trans.Commit(); } return count; } catch { trans.Rollback(); throw; } finally { trans.Dispose(); connOracle.Close(); } } /** * 批量插入数据 * @tableName 表名称 * @columnRowData 键-值存储的批量数据:键是列名称,值是对应的数据集合 * @conStr 连接字符串 */ public static int BatchInsert2(string tableName, DataTable dt) { try { int len = 1000; if (string.IsNullOrEmpty(tableName)) { throw new ArgumentException("必须指定批量插入的表名称", "tableName"); } int iResult = 0; StringBuilder sbCmdText = new StringBuilder(); string strfields = ""; string strvalues = ""; foreach (DataColumn clomn in dt.Columns) { string strfiled = clomn.ColumnName; strfields += strfiled + ","; strvalues += ":" + strfiled + ","; } if (strfields != "") { strfields = strfields.Substring(0, strfields.LastIndexOf(",")); strvalues = strvalues.Substring(0, strvalues.LastIndexOf(",")); } sbCmdText.Append("insert into " + tableName + "(" + strfields + ") values (" + strvalues + ")"); using (OracleConnection conn = new OracleConnection(OracleHelper.AYCRMConn)) { using (OracleCommand cmd = conn.CreateCommand()) { //绑定批处理的行数 cmd.ArrayBindCount = len; cmd.BindByName = true; cmd.CommandType = CommandType.Text; cmd.CommandText = sbCmdText.ToString(); cmd.CommandTimeout = 600;//10分钟 //创建参数 OracleParameter oraParam; List cacher = new List(); OracleDbType dbType = OracleDbType.Object; foreach (DataColumn column in dt.Columns) { dbType = GetOracleDbType(column.DataType.FullName); oraParam = new OracleParameter(":" + column.ColumnName, dbType); oraParam.Direction = ParameterDirection.Input; oraParam.OracleDbTypeEx = dbType; oraParam.Value = dt.AsEnumerable().Select(r => r[column.ColumnName]).ToArray(); cmd.Parameters.Add(oraParam); } //打开连接 conn.Open(); /*执行批处理*/ var trans = conn.BeginTransaction(); try { cmd.Transaction = trans; iResult = cmd.ExecuteNonQuery(); trans.Commit(); } catch (Exception ex) { trans.Rollback(); throw ex; } finally { if (conn != null) conn.Close(); } } } return iResult; } catch { throw; } { } } /** * 根据数据类型获取OracleDbType */ private static OracleDbType GetOracleDbType(object value) { OracleDbType dataType = OracleDbType.Object; 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; } private static OracleDbType GetOracleDbType(string dbType) { OracleDbType dataType = OracleDbType.Object; if (dbType == "System.DateTime") { dataType = OracleDbType.Date; } else if (dbType == "System.Decimal") { dataType = OracleDbType.Decimal; } else { dataType = OracleDbType.NVarchar2; } return dataType; } } }