c# - 在 odp.net 中插入带参数的多行

标签 c# odp.net

我想在带有 OracleParameter 的 oracle 中使用“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;

        } 

最佳答案

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

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

关于c# - 在 odp.net 中插入带参数的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463205/

相关文章:

c# - 使用 ODP.Net 的问题

c# - 垃圾收集保证

c# - RabbitMQ 异步支持

c# - HtmlEncode 列表<字符串> 值

c# - 使用 ODP.NET 按名称绑定(bind)查询参数

c# - 用于更新数据集的 OracleDataAdapter CommandText

c# - MYSQL 命令可以上传到数据库的最大查询是多少?

C# ToCharArray 不适用于 char*

nhibernate - NHibernate 和 DateTime 映射的问题

c# - ODP.NET 存储过程和可选参数