2017-05-30 66 views
0

ODP.NET配列バインディング機能のようにnpgsqlで一括操作を行う方法はありますか? バッチ処理/パイプライン処理/複数のSQL文が1つのコマンド(1回の往復で実行)で認識されますが、すべてのステートメントに対して異なるパラメータを使用して同じ方法で使用することはできません。もしそれができれば、誰かが以下のコードを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が裏で働いていると思います...) – Eve

+0

新しい行/オブジェクトを挿入することはできませんあなたは準備されたINSERTステートメントを使う必要があることを意味します - あなたは(単純な)INSERTステートメントで行うことができます。また、パラメータ名を扱う必要がなくなります。私が指摘した文書を読むことは良い考えです。 –

関連する問題