2017-05-30 55 views
0

有没有像使用ODP.NET数组绑定功能一样使用npgsql进行批量操作的方法? 我知道单个命令中的Batching/Pipelining /多个SQL语句(在单个往返中执行),但据我所知,不能以相同的方式使用它,并且每个语句的参数都不相同。如果可以完成,我会很高兴如果有人能够提供一个示例如何将下面的代码转换为Npgsql。使用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

如果你正在寻找的是多行的批量插入,你应该看看binary COPY - 这绝对是最有效的方法。

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

+0

感谢您的快速响应。我想插入新的行/对象,所以我想我必须准备好INSERT语句。 因此,我将不得不为odp.net创建单独的参数名称,而不是像odp.net一样使用数组(我想这就是odp.net在幕后工作的方式......) – Eve

+0

插入新的行/对象不会意味着你必须使用准备好的INSERT语句 - 任何你可以用(简单)INSERT语句完成的任何事情,你也可以用COPY来完成,除了后者会更有效率。它还可以为您节省处理参数名称的麻烦。阅读我指出的文档是个好主意。 –