3

我想在 oracle 中使用带有 OracleParameter 的“全部插入”语句。我必须仅在一次执行中插入可变编号行。我怎样才能做到这一点?这里有一些代码:

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;

        } 
4

2 回答 2

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 工具(无论如何可能会循环)会更有效一口气插入所有数据。

于 2013-05-09T14:21:40.890 回答
2

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

请看一下我对这个问题的回答,例如:C# 2010, ODP.net, call stored procedure passing array

于 2013-05-12T05:39:30.440 回答