2011-08-17 17 views
0

こんにちは私はOracle 10g DbにSQL一括挿入を使用しています。私はODP.NETを使用します。なぜなら、テーブルに20.000〜40.000の行を挿入する必要があるからです。長い時間、LINQ to SQLを使用してください(Oracle devartの場合はhttp://www.devart.com/linqconnect/)。 "ADO.NET"オブジェクトを使用する必要がありますが、私のコードはひどく見えます。あなたは私を助け、私の考えを屈折法に与えることができますか?私はコードの可読性とperformacneの間の妥協点を探したいと思います。私の英語SQL一括挿入ツールを使用した屈折計コード

private void InitArrays(int size) 
    { 
     _id = new string[size]; 
     _lm = new DateTime[size]; 
     _priceWithoutDiscount = new decimal[size]; 
     _priceWithDiscount = new decimal[size]; 
     _talkTime = new int[size]; 
     _type = new string[size]; 
     _voiceNetwork = new string[size]; 
     _callNo = new string[size]; 
     _callDate = new DateTime[size]; 
     _callType = new string[size]; 
     _surname = new string[size]; 
     _name = new string[size]; 
     _no = new string[size]; 
    } 

    private void PrepareArrays(IList<Call> calls) 
    { 
     InitArrays(calls.Count); 

     Parallel.For(0, calls.Count, i => 
     { 
      _id[i] = IdGenerator.GenerateGuidForCall(calls[i]); 
      _no[i] = calls[i].Number; 
      _name[i] = calls[i].Name; 
      _surname[i] = calls[i].Surname; 
      _callType[i] = calls[i].CallType; 
      _callDate[i] = calls[i].Dt; 
      _callNo[i] = calls[i].CallingNumber; 
      _voiceNetwork[i] = calls[i].VoiceNetwork; 
      _type[i] = calls[i].Type; 
      _talkTime[i] = calls[i].TalkTimeInSec; 
      _priceWithDiscount[i] = (decimal)calls[i].PriceWithDiscount; 
      _priceWithoutDiscount[i] = (decimal)calls[i].PriceWithoutDiscount; 
      _lm[i] = DateTime.Now; 

     }); 
    } 


    public void InsertCalls(IList<Call> calls) 
    { 
     PrepareArrays(calls); 

     string sql = "insert into r_calls (ID, NO, NAME, SURNAME, CALL_TYPE, CALL_DATE, CALL_NO, VOICE_NETWORK," 
        +"TYPE, TALK_TIME,PRICE_WITH_DISCOUNT, PRICE_WITHOUT_DISCOUNT, LM_MODIFIED) " 
        + "values (:id, :no, :name, :surname, :callType, :callDate, :callNo, :voiceNetwork, :type," 
        +" :talkTime, :priceWithDiscount, :priceWithoutDiscount, :lm)"; 


     var cnn = new OracleConnection(GenerateConnectionString()); 
     cnn.Open(); 
     OracleCommand cmd = cnn.CreateCommand(); 
     cmd.CommandText = sql; 
     cmd.CommandType = CommandType.Text; 
     cmd.BindByName = true; 

     // To use ArrayBinding, we need to set ArrayBindCount 
     cmd.ArrayBindCount = _id.Count(); 

     // Instead of single values pass arrays of values as parameters 
     cmd.Parameters.Add(":id", OracleDbType.Varchar2, 
          _id, ParameterDirection.Input); 

     cmd.Parameters.Add(":no", OracleDbType.Varchar2, 
          _no, ParameterDirection.Input); 

     cmd.Parameters.Add(":name", OracleDbType.Varchar2, 
          _name, ParameterDirection.Input); 

     cmd.Parameters.Add(":surname", OracleDbType.Varchar2, 
          _surname, ParameterDirection.Input); 

     cmd.Parameters.Add(":callType", OracleDbType.Varchar2, 
          _callType, ParameterDirection.Input); 

     cmd.Parameters.Add(":callDate", OracleDbType.Date, 
          _callDate, ParameterDirection.Input); 

     cmd.Parameters.Add(":callNo", OracleDbType.Varchar2, 
          _callNo, ParameterDirection.Input); 

     cmd.Parameters.Add(":voiceNetwork", OracleDbType.Varchar2, 
          _voiceNetwork, ParameterDirection.Input); 

     cmd.Parameters.Add(":type", OracleDbType.Varchar2, 
          _type, ParameterDirection.Input); 

     cmd.Parameters.Add(":talkTime", OracleDbType.Decimal, 
          _talkTime, ParameterDirection.Input); 

     cmd.Parameters.Add(":priceWithDiscount", OracleDbType.Decimal, 
          _priceWithDiscount, ParameterDirection.Input); 

     cmd.Parameters.Add(":priceWithoutDiscount", OracleDbType.Decimal, 
          _priceWithoutDiscount, ParameterDirection.Input); 

     cmd.Parameters.Add(":lm", OracleDbType.Date, 
         _lm, ParameterDirection.Input); 


     cmd.ExecuteNonQuery(); 
     cnn.Close(); 

    } 

答えて

0

ため

申し訳ありませんこれは私にはよさそうだが、私はそれの上にStyleCopを実行することをお勧めしたいです。

また、あなたは、SQL文のための別のフォーマットを使用することができます。

string sqlStatement = @" 
insert into TABLE 
(COL1, COL2, COL3) VALUES 
(:COL1, :COL2, :COL3) 
"; 

はまた、接続とコマンドのusingを使用します。それはIDisposableを実装し、従ってusingブロックにラップすることができます。

using(var connection = this.GetSomeConnection()) 
using(var command = this.InitTheCommandSomehow(connection)) 
{ 
    // here your code can safely throw exceptions etc. 
    // and the connection will still be closed 

    ... 

    cmd.Parameters.Add(
     "id", 
     OracleDbType.Varchar2, 
     _id, 
     ParameterDirection.Input); 

    ... 

} 
0

これはソリューション全体ではないかもしれませんが、まずパラメータ名のハードコーディングを避けることを試みます。私は、テーブルスキーマ自体からparamの名前を取得し、それを介してデータを送信します。これはリファクタリングのビットです。私はこれについての記事を書いて、それをチェックしてください:http://www.codeproject.com/KB/TipsnTricks/StoredProcSchemaSaving.aspx

関連する問題