実現したいこと
C#(.NET Framework4.8.1)とSQLiteを使用したアプリケーションを作っています。
JSONファイルから読み込んだデータをテーブルにインサートする部分で詰まっています。
発生している問題・分からないこと
ファイルから読み取った値を、パラメータとしてCommandTextに渡しているのですが、SQL文の実行時にエラーが出ます。
エラーメッセージは「パラメータが渡されていない」と言っているのですが、ブレークポイントを置いて確認したところ、意図した数のパラメータが渡されていました。
エラーメッセージ
error
1System.InvalidOperationException: 'Must add values for the following parameters: '
該当のソースコード
C#
1 // -------------------------- 2 // JSONファイルの読み込み 3 // -------------------------- 4 5 private List<dynamic> ReadJSONFile(string JSONFilePath) 6 { 7 List<dynamic> result = new List<dynamic>(); 8 9 if (File.Exists(JSONFilePath)) 10 { 11 string JsonData=File.ReadAllText(JSONFilePath); 12 result=JsonConvert.DeserializeObject<List<dynamic>>(JsonData); 13 } 14 return result; 15 }
C#
1 // -------------------------- 2 // 指定されたテーブルにインサート 3 // -------------------------- 4 5 private void SetDBData(string TableName, List<dynamic> dbData) 6 { 7 using (var conn = new SqliteConnection($"Data Source={databasePath}")) 8 { 9 conn.Open(); 10 using (var tran = conn.BeginTransaction()) 11 { 12 var cmd = conn.CreateCommand(); 13 int counter = 0; 14 15 switch (TableName) 16 { 17 case "chip_type_table": 18 cmd.CommandText = "insert into chip_type_table(chip_type_id,type_name,chip_id,mask_value) " + 19 "values(@chip_type_id,@type_name,@chip_id,@mask_value)"; 20 foreach (dynamic x in dbData) 21 { 22 cmd.Parameters.Add(new SqliteParameter("@chip_type_id", x.chip_type_id.ToString())); 23 cmd.Parameters.Add(new SqliteParameter("@type_name", x.type_name.ToString())); 24 cmd.Parameters.Add(new SqliteParameter("@chip_id", x.chip_id.ToString())); 25 cmd.Parameters.Add(new SqliteParameter("@mask_value", x.mask_value.ToString())); 26 counter++; 27 28 if (counter % 100 == 0 || counter == dbData.Count) 29 { 30 int result = cmd.ExecuteNonQuery(); //ここでエラー 31 if (result == 0) 32 { 33 cmd.Parameters.Clear(); 34 } 35 else 36 { 37 tran.Rollback(); 38 return; 39 } 40 } 41 } 42 break; //この後にcase文で同様の処理が続きます 43 } 44 45 tran.Commit(); 46 } 47 conn.Close(); 48 } 49 }
C#
1 // -------------------------- 2 // ボタンを押して実行 3 // -------------------------- 4 private void Tourokubutton_Click(object sender, EventArgs e) 5 { 6 SetDBData("chip_type_table", ReadJSONFile(FilePathtextBox.Text)); 7 } 8 9
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
同様のエラーメッセージが出る事例を見つけました。解決方法はEntity Framework Coreを使用するというものでした。
私の場合は、.NET Framework4.8.1で開発をしているため、Entity Framework Coreを使用することができませんでした。
補足
【新たに試したこと1】
YT0014さまのコメントをもとに修正しました。
テーブルのデータ型と合わせた型にパラメータを変更しました。
解決はせず、同様のエラーメッセージが表示されます。
C#
1インサート用の関数を修正(22行目) 2cmd.Parameters.Add(new SqliteParameter("@chip_type_id",(int)x.chip_type_id )); 3cmd.Parameters.Add(new SqliteParameter("@chip_type_id",int.Parse(x.chip_type_id.ToString())));
【新たに試したこと2】
新たにChipTypeTableクラスを作りました。DBのテーブルに合わせた内容になっています。
C#
1 public class ChipTypeTable 2 { 3 public int chip_type_id { get; set; } 4 public string type_name { get; set; } 5 public string chip_id { get; set; } 6 public string mask_value { get; set; } 7}
また、読み込んだJSONファイルの内容をデシリアライズするとき、デシリアライズの結果の型をList<dynamic>にしていたのを、List<ChipTypeTable>に変更しました。
回答1件
あなたの回答
tips
プレビュー