いつも大変助けて頂いております。
感謝しております。
今、C#からsqliteにデータをインサートするプログラムを作成しています。
今、例として、このようなテーブルに、
CREATE TABLE `TABLE_SAMPLE` ( `ID` INTEGER NOT NULL, `DATA` TEXT NOT NULL, PRIMARY KEY(ID) );
このようなプログラムでインサートをしているのですが、
C#
1//SQLiteにデータ書き込み 2using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) 3{ 4 cn.Open(); 5 6 try 7 { 8 // CSV インサート 9 using (SQLiteTransaction trans = cn.BeginTransaction()) 10 { 11 12 SQLiteCommand cmd = cn.CreateCommand(); 13 14 // インサート文 15 cmd.CommandText = "INSERT INTO TABLE_SAMPLE (ID, DATA) VALUES (@id, @data)"; 16 17 // パラメータのセット 18 cmd.Parameters.Add("id", System.Data.DbType.UInt16); 19 cmd.Parameters.Add("data", System.Data.DbType.String); 20 21 try 22 { 23 24 foreach (SelectResult csvfile in result) 25 { 26 27 // csvファイルを開く 28 using (var sr = new System.IO.StreamReader(@csvfile.filepath)) 29 { 30 31 int csvcont; 32 csvcont = 0; 33 34 // ストリームの末尾まで繰り返す 35 while (!sr.EndOfStream) 36 { 37 38 csvcont++; 39 40 // ファイルから一行読み込む 41 var line = sr.ReadLine(); 42 // 読み込んだ一行をカンマ毎に分けて配列に格納する 43 var values = line.Split(','); 44 var ii = 0; 45 46 // 出力する 47 foreach (var value in values) 48 { 49 50 switch (ii) 51 { 52 case 0: 53 cmd.Parameters["id"].Value = int.Parse(value); 54 break; 55 case 1: 56 cmd.Parameters["data"].Value = int.Parse(value); 57 break; 58 default: 59 break; 60 } 61 62 ii++; 63 64 } 65 66 cmd.ExecuteNonQuery(); 67 68 } 69 70 } 71 72 } 73 } 74 catch (System.Exception e) 75 { 76 // ファイルを開くのに失敗したとき 77 LogOutput(e.Message, true, true); 78 } 79 80 // コミット 81 trans.Commit(); 82 83 } 84 85 } 86 catch (Exception exception) 87 { 88 LogOutput(exception.Message, true, true); 89 return false; 90 } 91 92}
当然ながら、プライマリーキーであるIDが重複したデータをインサートしようとするとエラーになります。
これをなんとか、プライマリーキーが重複した場合はインサートしないようにするか、または、構わずインサートをして、エラーが起こっても、その後の処理が継続するようにしたいと思っています。
このような場合、インサート前にselectでデータカウントをしてみないといけないのでしょうか?
データ件数が多いので、1データインサートするごとにSELECTするのは、時間がかかるのではないかと思い、心配です。
また、このインサートは、CSVファイルを読み込んでデータ分ループさせているのですが、エラーでcatchに入ってしまうと、forループがそこで終わってしまうので、うまくいきません。
例えば、プライマリーキーが重複する場合は、インサートせずにエラーにもしないような、何かいい方法は無いでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/04 05:47 編集
2016/06/04 06:14 編集
2016/06/04 07:06