与Npgsql绑定数组

时间:2017-05-30 11:20:03

标签: .net npgsql

有没有办法用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();

1 个答案:

答案 0 :(得分:1)

如果您要查找的是大量插入多行,您应该查看binary COPY - 这绝对是最有效的方法。

否则,绝对可以准备INSERT语句,然后在同一个往返中使用不同的参数批处理/管道化它的执行。这将产生非常好的性能,但仍然不如二进制COPY。