需要寫一個搬遷資料的job,目前用的OracleBulkCopy,但是表有觸發器就不能用了
uj5u.com熱心網友回復:
是的,你需要先禁用觸發器這些,才能 bulkcopyuj5u.com熱心網友回復:
先禁用觸發器再插入不合適,肯定搬遷的資料會不對,只能找別的辦法了
uj5u.com熱心網友回復:
我在網上找的插入的方法,但是會提示 無法將型別為“System.String”的物件強制轉換為型別“System.Array”。
public static int BatchInsert(string tableName, DataTable dt, string conStr, string[] strColumns)
{
int dtRowsCount = dt.Rows.Count;
int iResult = 0;
StringBuilder sbCmdText = new StringBuilder();
if (dtRowsCount > 0)
{
//準備插入的SQL
sbCmdText.Append("BEGIN ");
for (int i = 0; i < dt.Rows.Count; i++)
{
sbCmdText.AppendFormat("INSERT INTO {0}(", tableName);
sbCmdText.Append(string.Join(",", strColumns));
sbCmdText.Append(") VALUES (");
sbCmdText.Append(":A00"+i + string.Join(",:A00" + i, strColumns));
sbCmdText.Append(");");
}
sbCmdText.Append("END;");
using (OracleConnection conn = new OracleConnection(conStr))
{
using (OracleCommand cmd = conn.CreateCommand())
{
//系結批處理的行數
cmd.ArrayBindCount = dtRowsCount;
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;
for (int j = 0; j < dtRowsCount; j++)
{
for (int i = 0; i < strColumns.Count(); i++)
{
dbType = GetOracleDbType(dt.Rows[j][i]);
oraParam = new OracleParameter("A00" + j + strColumns[i], dbType);
oraParam.Direction = ParameterDirection.Input;
oraParam.OracleDbTypeEx = dbType;
oraParam.Value = dt.Rows[j][i];
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;
}
/**
* 根據資料型別獲取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;
}
uj5u.com熱心網友回復:
沒有時效性要求的話,可以試試penthaho kettle轉載請註明出處,本文鏈接:https://www.uj5u.com/net/9864.html
標籤:ASP.NET
上一篇:單元測驗該怎寫?他的意義是什么?
