使用 C# 从 DataTable 批量插入到 Oracle
Bulk insert to Oracle from a DataTable using C#
我一直在寻找,但没有找到一个很好的例子来说明我需要完成什么。标题说明了一切。这是我目前所拥有的:
//gather the report details
DataTable dtReturn = new DataTable();
DataTable dtResults = new DataTable();
string strScript = "";
bool doReturnData = false;
try
{
//this function returns my SQL table in to a datatable dtReturn:
var ii =
Utility.db.Connection.EstablishDBConnection("usp_get_data_recap", dtReturn, null, null, true, 60);
//Clear out table before insert
dtResults = OracleDataPull(9, "TRUNCATE TABLE user.SIGNUP_1");
OracleParameter myparam = new OracleParameter();
OracleCommand mycommand = new OracleCommand();
int n;
//bulk insert to the signup_1 table from the datatable members. Datatable contains the same 4 fields being inserted in to signup_1 on the oracle side:
mycommand.CommandText = "INSERT INTO user.SIGNUP_1 ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)";
mycommand.Parameters.Add(myparam);
for (n = 0; n < 100000; n++)
{
[what do i do here?]
}
}
我不确定这是否正确,或者是否有更简单的方法,但我需要将 dtReturn.Rows[n][0-3] 映射到 ID,account_number,main_customer 和 signup_date 分别。
非常感谢帮助!提前致谢!
编辑:
我尝试了下面的建议,但 lambda 表达式出现错误:
"Cannot convert lambda expression to type 'string' because it is not a delegate type" :
var ii =
Utility.db.Connection.EstablishDBConnection("usp_get_data", dtReturn, null, null, true, 60);
dtResults = OracleDataPull(9, "TRUNCATE TABLE user.PR_data");
OracleParameter myparam = new OracleParameter();
OracleCommand mycommand = new OracleCommand();
mycommand.ArrayBindCount = dtReturn.Rows.Count;
mycommand.Parameters.Add(":myparam", OracleDbType.Varchar2, dtReturn.Select(c => c.myparam).ToArray(), ParameterDirection.Input);
mycommand.ExecuteNonQuery();
int n;
mycommand.CommandText = "INSERT INTO user.PR_data ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)";
mycommand.Parameters.Add(myparam);
for (n = 0; n < 100000; n++)
{
myparam.Value = n + 1;
mycommand.ExecuteNonQuery();
}
dtResults = Utility.db.Connection.oracletoDataTable(strScript, doReturnData);
我也不确定这是为了产生正确的结果而设置的。你能告诉我哪里出了问题吗?
mycommand.ArrayBindCount = dtResults.Count;
mycommand.Parameters.Add(":parameterName", OracleDbType.Varchar2, dtResults.Select(c => c.ParameterName).ToArray(), ParameterDirection.Input);
mycommand.ExecuteNonQuery() ;
设置 CommandText 后,您可以使用上面的代码。
感谢 codeproject.com,我实际上找到了一种更有效的解决方案。
这是我最后的方法,效果很好。我所做的就是用我的 schema.table 和数据表调用它,它会处理其余的:
public static void WriteToServer(string qualifiedTableName, DataTable dataTable)
{
//**************************************************************************************************************************
// Summary: Hit the Oracle DB with the provided datatable. bulk insert data to table.
//**************************************************************************************************************************
// History:
// 10/03/2017 Created
//**************************************************************************************************************************
try
{
OracleConnection oracleConnection = new OracleConnection(Variables.strOracleCS);
oracleConnection.Open();
using (OracleBulkCopy bulkCopy = new OracleBulkCopy(oracleConnection))
{
bulkCopy.DestinationTableName = qualifiedTableName;
bulkCopy.WriteToServer(dataTable);
}
oracleConnection.Close();
oracleConnection.Dispose();
}
catch (Exception ex)
{
Utility.db.Log.Write(Utility.db.Log.Level.Error, "Utility", "db:WriteToServer: " + ex.Message);
throw;
}
}
参考:https://www.codeproject.com/Questions/228101/oracle-data-bulk-insert
我一直在寻找,但没有找到一个很好的例子来说明我需要完成什么。标题说明了一切。这是我目前所拥有的:
//gather the report details
DataTable dtReturn = new DataTable();
DataTable dtResults = new DataTable();
string strScript = "";
bool doReturnData = false;
try
{
//this function returns my SQL table in to a datatable dtReturn:
var ii =
Utility.db.Connection.EstablishDBConnection("usp_get_data_recap", dtReturn, null, null, true, 60);
//Clear out table before insert
dtResults = OracleDataPull(9, "TRUNCATE TABLE user.SIGNUP_1");
OracleParameter myparam = new OracleParameter();
OracleCommand mycommand = new OracleCommand();
int n;
//bulk insert to the signup_1 table from the datatable members. Datatable contains the same 4 fields being inserted in to signup_1 on the oracle side:
mycommand.CommandText = "INSERT INTO user.SIGNUP_1 ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)";
mycommand.Parameters.Add(myparam);
for (n = 0; n < 100000; n++)
{
[what do i do here?]
}
}
我不确定这是否正确,或者是否有更简单的方法,但我需要将 dtReturn.Rows[n][0-3] 映射到 ID,account_number,main_customer 和 signup_date 分别。
非常感谢帮助!提前致谢!
编辑:
我尝试了下面的建议,但 lambda 表达式出现错误: "Cannot convert lambda expression to type 'string' because it is not a delegate type" :
var ii =
Utility.db.Connection.EstablishDBConnection("usp_get_data", dtReturn, null, null, true, 60);
dtResults = OracleDataPull(9, "TRUNCATE TABLE user.PR_data");
OracleParameter myparam = new OracleParameter();
OracleCommand mycommand = new OracleCommand();
mycommand.ArrayBindCount = dtReturn.Rows.Count;
mycommand.Parameters.Add(":myparam", OracleDbType.Varchar2, dtReturn.Select(c => c.myparam).ToArray(), ParameterDirection.Input);
mycommand.ExecuteNonQuery();
int n;
mycommand.CommandText = "INSERT INTO user.PR_data ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)";
mycommand.Parameters.Add(myparam);
for (n = 0; n < 100000; n++)
{
myparam.Value = n + 1;
mycommand.ExecuteNonQuery();
}
dtResults = Utility.db.Connection.oracletoDataTable(strScript, doReturnData);
我也不确定这是为了产生正确的结果而设置的。你能告诉我哪里出了问题吗?
mycommand.ArrayBindCount = dtResults.Count;
mycommand.Parameters.Add(":parameterName", OracleDbType.Varchar2, dtResults.Select(c => c.ParameterName).ToArray(), ParameterDirection.Input);
mycommand.ExecuteNonQuery() ;
设置 CommandText 后,您可以使用上面的代码。
感谢 codeproject.com,我实际上找到了一种更有效的解决方案。
这是我最后的方法,效果很好。我所做的就是用我的 schema.table 和数据表调用它,它会处理其余的:
public static void WriteToServer(string qualifiedTableName, DataTable dataTable)
{
//**************************************************************************************************************************
// Summary: Hit the Oracle DB with the provided datatable. bulk insert data to table.
//**************************************************************************************************************************
// History:
// 10/03/2017 Created
//**************************************************************************************************************************
try
{
OracleConnection oracleConnection = new OracleConnection(Variables.strOracleCS);
oracleConnection.Open();
using (OracleBulkCopy bulkCopy = new OracleBulkCopy(oracleConnection))
{
bulkCopy.DestinationTableName = qualifiedTableName;
bulkCopy.WriteToServer(dataTable);
}
oracleConnection.Close();
oracleConnection.Dispose();
}
catch (Exception ex)
{
Utility.db.Log.Write(Utility.db.Log.Level.Error, "Utility", "db:WriteToServer: " + ex.Message);
throw;
}
}
参考:https://www.codeproject.com/Questions/228101/oracle-data-bulk-insert