2017-04-04 15 views
0

このサイトで他の質問を確認しましたが、解決策はありませんでした。C#Access:INSERT SQL文の条件式エラーのデータ型の不一致

C#でSQLを使用して、新しいレコードをローカルAccessデータベースに挿入しようとしています。現在、実行時にthisエラーが発生しています。

フル方法:

public static void AddNewMusicFile(MusicFile m) 
{ 
     long newID; 
     int genreID = GenreDB.GetGenreID(m.AUDFIL_GENRE_NM); 

     String strSQL = String.Empty; 

     OleDbTransaction transaction = null; 
     OleDbCommand cm = new OleDbCommand(); 
     OleDbConnection cn = new OleDbConnection(strConnString); 

     cm.Connection = cn; 

     cn.Open(); 

     transaction = cn.BeginTransaction(); 

     cm.Connection = cn; 
     cm.Transaction = transaction; 

     strSQL = "INSERT INTO AUDIOFILES_MSTR "; 
     strSQL += "("; 
     strSQL += "AUDFIL_TT, "; 
     strSQL += "AUDFIL_RELEASE_DTM, "; 
     strSQL += "AUDFIL_LENGTH, "; 
     strSQL += "AUDFIL_GENRE_ID, "; 
     strSQL += "AUDFIL_TYPE_ID, "; 
     strSQL += "AUDFIL_ADD_DTM, "; 
     strSQL += "AUDFIL_STAT_CD "; 
     strSQL += ") VALUES ("; 
     strSQL += "@AUDFIL_TT, "; 
     strSQL += "@AUDFIL_RELEASE_DTM, "; 
     strSQL += "@AUDFIL_LENGTH, "; 
     strSQL += "@AUDFIL_GENRE_ID, "; 
     strSQL += "@AUDFIL_TYPE_ID, "; 
     strSQL += "@AUDFIL_ADD_DTM, "; 
     strSQL += "@AUDFIL_STAT_CD "; 
     strSQL += ")"; 
     cm.CommandText = strSQL; 

     OleDbParameter pm = new OleDbParameter("@AUDFIL_TT", OleDbType.Char, 163); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.AUDFIL_TT; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@AUDFIL_RELEASE_DTM", OleDbType.Date); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.AUDIL_RELEASE_DTM; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@AUDFIL_LENGTH", OleDbType.Integer); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.AUDFIL_LENGTH; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@genreID", OleDbType.Integer); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = genreID; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@AUDFIL_TYPE_ID", OleDbType.Integer); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.AUDFIL_TYPE_ID; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@AUDFIL_ADD_DTM", OleDbType.Date); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.AUDFIL_ADD_DTM; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@AUDFIL_STAT_CD", OleDbType.VarChar, 1); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = 'A'; 
     cm.Parameters.Add(pm); 

     cm.ExecuteNonQuery(); 

     cm.CommandText = "SELECT @@IDENTITY AS AUDFIL_ID;"; 
     newID = int.Parse(cm.ExecuteScalar().ToString()); 

     strSQL = "INSERT INTO MUSICFILES_SPLM "; 
     strSQL += "("; 
     strSQL += "AUDFIL_ID, "; 
     strSQL += "MSC_ARTIST_NM, "; 
     strSQL += "MSC_ALBUM_NM, "; 
     strSQL += "MSC_PRODUCER_NM, "; 
     strSQL += "MSC_LABEL_NM "; 
     strSQL += ") VALUES ("; 
     strSQL += "@AUDFIL_ID, "; 
     strSQL += "@MSC_ARTIST_NM, "; 
     strSQL += "@MSC_ALBUM_NM, "; 
     strSQL += "@MSC_PRODUCER_NM, "; 
     strSQL += "@MSC_LABEL_NM "; 
     strSQL += ")"; 
     cm.CommandText = strSQL; 

     pm = new OleDbParameter("@AUDFIL_ID", OleDbType.Integer); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = newID; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@MSC_ARTIST_NM", OleDbType.Char, 50); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.MSC_ARTIST_NM; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@MSC_ALBUM_NM", OleDbType.Char, 163); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.MSC_ALBUM_NM; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@MSC_PRODUCER_NM", OleDbType.Char, 50); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.MSC_PRODUCER_NM; 
     cm.Parameters.Add(pm); 

     pm = new OleDbParameter("@MSC_LABEL_NM", OleDbType.Char, 30); 
     pm.Direction = ParameterDirection.Input; 
     pm.Value = m.MSC_LABEL_NM; 
     cm.Parameters.Add(pm); 

     cm.ExecuteNonQuery(); 
     transaction.Commit(); 
} 

トランザクションがコミットされる前にエラーが最後cm.ExecuteNonQuery()でトリガされます。

私はにデータを追加しようとしている表では、このいずれかになります。

Table Structure

音楽ファイルオブジェクトを作成し、Addメソッドを呼び出し方法:私が持っている

private void btnAdd_Click(object sender, EventArgs e) 
{ 
     MusicFile m = new MusicFile(); 
     m.MSC_ARTIST_NM = txtArtist.Text; 
     m.MSC_ALBUM_NM = txtAlbum.Text; 
     m.MSC_PRODUCER_NM = txtProducer.Text; 
     m.MSC_LABEL_NM = txtLabel.Text; 

     m.AUDFIL_TT = txtTitle.Text; 
     m.AUDIL_RELEASE_DTM = dtpReleaseDate.Value; 
     m.AUDFIL_TYPE_ID = 1; 
     m.AUDFIL_LENGTH = (((long)nudHours.Value * 3600) + ((long)nudMinutes.Value * 60) + (long)nudSeconds.Value); 
     m.AUDFIL_GENRE_NM = cbxGenre.SelectedItem.ToString(); 
     m.AUDFIL_ADD_DTM = Convert.ToDateTime(DateTime.Now.ToShortDateString()); 

     AudioBaseDB.AddNewMusicFile(m); 
     MessageBox.Show("Record Added Successfully"); 
} 

これに2,3時間かかっていて、どのパラメータがエラーを引き起こしているのか見つけることができません。

+0

先頭へ戻るスキーマを表示することができます – maSTAShuFu

+0

最初のSQLは失敗すると思います。 @AUDFIL_GENRE_IDの値を指定していません。 –

答えて

3

3つの異なる実行に同じコマンドを使用しています。問題は、あなたがOLEDBパラメータで

.... 
// First execution with the set of parameters defined before 
cm.ExecuteNonQuery(); 

// Second execution, no parameters required here 
cm.CommandText = "SELECT @@IDENTITY AS AUDFIL_ID;"; 
newID = int.Parse(cm.ExecuteScalar().ToString()); 

// Before starting to add the parameters for the final INSERT 
// clear the collection from the previous ones 
cm.Parameters.Clear(); 
.... 

は、自分の名前で認識されていない第三の実行とパラメータの第1セットを挿入しようとして末端ので、パラメータコレクションをクリアしますが、その位置でないということです。
最初のINSERTに関連するパラメータの最初のブロックを追加すると、OleDbは、最後のINSERTを実行するときに、最初のパラメータのプレースホルダ(@AUDFIL_ID)の値としてコレクションに追加された最初のパラメータ(@AUDFIL_TT)を取得します。幸いにも、データ型が一致せず、エラーメッセージが表示されます。偶然、すべての種類のデータ型が正しければ、2番目の表に誤ったデータを入力してしまいます。

個人的なメモ:このようにコマンドテキストを連結する代わりに、verbatim string literalを@文字で使用することをお勧めします。
わかりやすい

strSQL = @"INSERT INTO AUDIOFILES_MSTR 
      (AUDFIL_TT,AUDFIL_RELEASE_DTM,AUDFIL_LENGTH, 
       AUDFIL_GENRE_ID,AUDFIL_TYPE_ID,AUDFIL_ADD_DTM, 
       AUDFIL_STAT_CD) 
      VALUES 
      (@AUDFIL_TT,@AUDFIL_RELEASE_DTM,@AUDFIL_LENGTH, 
       @AUDFIL_GENRE_ID, @AUDFIL_TYPE_ID, @AUDFIL_ADD_DTM, 
       @AUDFIL_STAT_CD)"; 
関連する問題