ComplianceServer/oldcode/DAL/Util/OracleDataAccessHandler.cs

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;
}
}
}