C# 在odp.net中插入多个带参数的行

C# 在odp.net中插入多个带参数的行,c#,odp.net,C#,Odp.net,我想在oracle中使用带有OracleParameter的“insert all”语句。我必须只在一次执行中插入变量行。我该怎么做? 以下是一些代码: string queryInsertRecipients = "INSERT INTO YS_ES_TO(EMAILID,EMAILTO) VALUES(:pEMAILID,:pEMAILTO)"; OracleConnection connection = OracleConnectionOpen("csEmailManage

我想在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;

        } 
string queryInsertRecipients=“将(EMAILID,EMAILTO)值(:pEMAILID,:pEMAILTO)插入YS_ES_中”;
OracleConnection=OracleConnectionOpen(“csEmailManagement”);
OracleCommand=新的OracleCommand();
OracleParameter[]toParameters=新的OracleParameter[2];
for(int i=0;i
您可以通过动态生成参数来实现:

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;
OracleConnection=OracleConnectionOpen(“csEmailManagement”);
OracleCommand=新的OracleCommand();
//开始查询字符串
string query=“全部插入”;
for(int i=0;i
但是,请注意以下事项:

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

一句话:我不会在数千行中这样做。我会在循环中进行,或者查看其他一些ETL工具,因为我假设源值来自其他数据库,使用ETL工具(可能会循环)会更有效而不是将所有数据插入到一个SWOP中。

< P>我会考虑使用<强>绑定数组< /强>和存储过程。


请看一下我对这个问题的回答,例如:

为什么必须在一次执行中执行?为了获得最佳性能。我认为这是不可能的,因为每个命令只能有一个同名的参数。无论如何,这听起来不是个好主意。。。永远记住,过早优化是万恶之源。你认为它会快多少?我不知道,只是一个预测。如果有更好的主意,我可以接受。谢谢你的代码,关于插入所有语句和参数,你是对的。我将用存储过程来完成这项工作。嘿,干得好!但需要注意的是,如果您想使用全部插入,您需要这样做:将全部插入供应商(供应商id,供应商名称)值(1000,'IBM')插入供应商(供应商id,供应商名称)值(2000,'Microsoft')插入客户(客户id,客户名称,城市)值(999999,'Anderson Construction','New York'))从双重选择中选择*;所以,我用5个参数尝试了你的解决方案,唯一的改变就是删除了“全部插入”