gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:59:41 27 4
gpt4 key购买 nike

我想在带有 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com