C# で10万件のデータを一括インサートをする際、アプリのメモリが落ちてしまい、
インサートできないでいます。これを分割して(5千件毎に)Insertしてcommitを発行させる方法をご教授いただきたく
思います。
C#
1List<string> listA = new List<string>(); 2//10万件追加 3listA.Add(xxxx); 4 5StringBuilder strSql = new StringBuilder(); 6OracleConnection objConn; 7OracleCommand objCmd; 8OracleTransaction objTran = null; 9 10objTran = objConn.BeginTransaction(); //トランザクション開始 11 12strSql.AppendLine("INSERT INTO TABLE1"); 13strSql.AppendLine(" ("); 14strSql.AppendLine(" TEST1"); 15strSql.AppendLine(" ) "); 16strSql.AppendLine("VALUES ("); 17strSql.AppendLine(" :A"); 18strSql.AppendLine(" ) "); 19 20objCmd = new OracleCommand(); 21{ 22 objCmd.Connection = objConn; 23 objCmd.BindByName = true; 24 objCmd.ArrayBindCount = listA.Count; 25 26 OracleParameter oraA; 27 oraA = new OracleParameter("A", OracleDbType.Varchar2, ParameterDirection.Input); 28 oraA.ArrayBindSize = listA.Count; 29 oraA.Value = listA.ToArray(); 30 objCmd.Parameters.Add(oraA); 31 32 objCmd.CommandType = CommandType.Text; 33 objCmd.CommandText = strSql.ToString(); 34 intResult = objCmd.ExecuteNonQuery(); 35 36} 37 38objTran.Commit();//コミット
宜しくお願い致します。
https://teratail.com/questions/kx7sfuoukv2uph の私の回答の【追記】で書いたようにしてできませんか?
これ本当に実行できますか?
OracleParameter.ArrayBindSize は int[] なので
oraA.ArrayBindSize = listA.Count;
の行がコンパイルエラーになるはずです。
提示のコードは多分、質問用にオリジナルのコードを編集し、端折っているのでしょうね。提示のコードではobjConnをいきなり使っているし。
> OracleConnection objConn;
...
> objTran = objConn.BeginTransaction(); //トランザクション開始
質問のテーマとしては少し興味ありますが、10万件のデータを生成してどこでアプリが落ちているかにもよりますね。10万件をlistA.Add()しているところでメモリ使用量が増えてアップアップしそうですし、あとでlistA.ToArray()したところまた肥大しそうです。executeNonQuery()実行時に止めを刺している可能性も。テンポラリファイルにいったん保存して、外部ツールのSQL*Loaderを起動して実行するなんて手もありそうです。
あと、oraA.ArrayBindSize には項目長の配列を入れるのですが、TABLE1.TEST1 の項目長はいくつですか?
「OracleBulkCopy クラス」
https://docs.oracle.com/cd/E16635_01/win.111/e06104/OracleBulkCopyClass.htm
の使用も検討してみてください。
回答3件
あなたの回答
tips
プレビュー