218 lines
8.0 KiB
C#
218 lines
8.0 KiB
C#
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<IDbDataParameter> cacher = new List<IDbDataParameter>();
|
|
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;
|
|
}
|
|
}
|
|
}
|