有没有办法用npgsql进行批量操作,就像使用ODP.NET数组绑定功能一样? 我知道单个命令中的批处理/流水线/多个SQL语句(在单个往返中执行)但据我所知,你不能以相同的方式使用它,每个语句都有不同的参数。如果可以这样做,如果有人能提供如何将下面的代码转换为Npgsql的示例,我会很高兴。
List<dto> listDTO; // list containing up to 1000 dtos
OraCommand = db.GetOracleCommand();
OraCommand.CommandText = "INSERT INTO TABLE (ID, FIELD1, FIELD2) VALUES (:ID, :FIELD1, :FIELD2)";
object[] FIELD1 = new object[listDTO.Count];
object[] FIELD2 = new object[listDTO.Count];
for (int i = 0; i <= listDTO.Count - 1; i++)
{
ID[i] = listDTO.Id;
FIELD1[i] = listDTO.Field1;
FIELD2[i] = listDTO.Field2;
}
OraCommand.ArrayBindCount = listDTO.Count;
OraCommand.Parameters.Add(":ID", OracleDbType.Decimal, ID, System.Data.ParameterDirection.Input);
OraCommand.Parameters.Add(":FIELD1", OracleDbType.Varchar2, 10, FIELD1, System.Data.ParameterDirection.Input);
OraCommand.Parameters.Add(":FIELD2", OracleDbType.Varchar2, 32, FIELD2, System.Data.ParameterDirection.Input);
db.DoSqlPrepareCommand(OraCommand);
编辑: 这就是我认为最好使用Npgsql完成的方式:
NpgsqlConnection conn = new NpgsqlConnection("connString");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand();
string CommandText = "";
for (int i = 0; i <=5 ; i++)
{
CommandText = CommandText + "INSERT INTO testtbl (id, field1) VALUES (@ID_" + i + " , @FIELD1_" + i + ");";
command.Parameters.Add(new NpgsqlParameter("ID_" + i, i));
command.Parameters.Add(new NpgsqlParameter("FIELD1_" + i, "FIELD1" + i));
}
command.CommandText = CommandText;
command.Connection = conn;
int result = command.ExecuteNonQuery();
答案 0 :(得分:1)
如果您要查找的是大量插入多行,您应该查看binary COPY - 这绝对是最有效的方法。
否则,绝对可以准备INSERT语句,然后在同一个往返中使用不同的参数批处理/管道化它的执行。这将产生非常好的性能,但仍然不如二进制COPY。