在odp.net中插入带有参数的多行

时间:2013-05-09 13:40:04

标签: c# odp.net

我想在oracle中使用OracleParameter中的“insert all”语句。我必须在一次执行中插入变量行。我怎样才能做到这一点? 这里有一些代码:

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;

        } 

2 个答案:

答案 0 :(得分: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?)与实际参数数量
  • 我的猜测是,如果一个插入失败(坏数据/溢出/等),ALL将失败
  • 您可以在循环中创建命令和连接外部,并且每次只更改参数值。 SQL中的大部分时间开销都是建立连接。执行命令通常没有太多开销。

底线:我不会为数千行做这件事。我要么在循环中执行它,要么查看其他一些ETL工具,因为我假设源值来自其他一些数据库,使用ETL工具(可能会循环)会比使用它更有效率。一举插入所有数据。

答案 1 :(得分:2)

我考虑使用绑定数组和存储过程。

请查看我在这个问题上的答案,例如:C# 2010, ODP.net, call stored procedure passing array