2013-05-09 39 views
2

我想在Oracle中使用OracleParameter中的“insert all”语句。我只能在一次执行中插入可变数字行。我怎样才能做到这一点? 这里是一些代码:在odp.net中插入多行参数

string queryInsertRecipients = "INSERT INTO YS_ES_TO(EMAILID,EMAILTO) VALUES(:pEMAILID,:pEMAILTO)"; 
     OracleConnection connection = OracleConnectionOpen("csEmailManagement"); 
     OracleCommand command = new OracleCommand(); 
     OracleParameter[] toParameters = new OracleParameter[2]; 
     for (int i = 0; i < emailMessageList.Length; i++) 
     { 
      toParameters[0] = command.Parameters.Add("pEMAILID", OracleDbType.Int32, emailId, ParameterDirection.Input); 
      toParameters[1] = command.Parameters.Add("pEMAILTO", OracleDbType.Varchar2, emailMessageList[i], ParameterDirection.Input); 
      command.CommandText = queryInsertRecipients; 
      command.Connection = connection; 

     } 
+0

为什么一定要你在一个执行办呢? – 2013-05-09 13:44:47

+0

以获得最佳性能。 – cejoseph 2013-05-09 13:49:24

+0

我不认为这是可能的,因为每个命令只能有一个相同名称的参数。无论如何,这听起来不是一个好主意......永远记住,过早优化是万恶之源。 – 2013-05-09 13:57:29

回答

3

可能能够通过动态生成的参数做到这一点:

OracleConnection connection = OracleConnectionOpen("csEmailManagement"); 
OracleCommand command = new OracleCommand(); 

// Start query string 
string query = "INSERT ALL "; 
for (int i = 0; i < emailMessageList.Length; i++) 
{ 
    query = string.Format("{0} INTO YS_ES_TO(EMAILID,EMAILTO) VALUES (:{1}, :{2})", 
          query, 
          "pEMAILID_"+i, 
          "pEMAILTO_"+i); 

    command.Parameters.Add("pEMAILID_"+i, 
          OracleDbType.Int32, 
          emailId, 
          ParameterDirection.Input); 
    command.Parameters.Add("pEMAILTO_"+i, 
          OracleDbType.Varchar2, 
          emailMessageList[i], 
          ParameterDirection.Input); 
} 
command.CommandText = query; 
command.Connection = connection; 

注意下面的事情,但是:

  • 一些限制您可以拥有的参数数量,但它似乎取决于总量数据通过(64K?)与参数的实际数量
  • 我的猜测是,如果一个插入失败(坏数据/溢出/等),所有将失败
  • 你也可以创建命令并连接外部的,并且每次只更改参数值。 SQL中大部分时间都是建立连接。执行该命令通常不会有太多开销。

底线:我不会这样做成千上万的行。我会在循环中执行它,或者查看其他ETL工具,因为我假设源值来自其他数据库,并且使用ETL工具(它可能会循环)比使用ETL工具更有效一次性插入所有数据。

+0

感谢您的代码,你是正确的关于插入所有语句和参数。我会用存储过程来做到这一点。 – cejoseph 2013-05-10 08:36:20