Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Access:INSERT SQL语句的条件表达式中的数据类型不匹配错误_C#_Sql_Ms Access - Fatal编程技术网

C#Access:INSERT SQL语句的条件表达式中的数据类型不匹配错误

C#Access:INSERT SQL语句的条件表达式中的数据类型不匹配错误,c#,sql,ms-access,C#,Sql,Ms Access,我在这个网站上查过其他类似的问题,但他们的解决方案都不适合我 我正在使用C#中的SQL尝试将新记录插入本地Access数据库。目前,运行时出现错误 完整方法: public static void AddNewMusicFile(MusicFile m) { long newID; int genreID = GenreDB.GetGenreID(m.AUDFIL_GENRE_NM); String strSQL = String.Empty;

我在这个网站上查过其他类似的问题,但他们的解决方案都不适合我

我正在使用C#中的SQL尝试将新记录插入本地Access数据库。目前,运行时出现错误

完整方法:

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()
触发错误

我正在尝试向其中添加数据的表如下所示:

创建音乐文件对象并调用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");
}

我已经在这个问题上纠缠了几个小时,找不到导致错误的参数。

您在三次不同的执行中使用了相同的命令。问题是您没有清除parameters集合,因此在第三次执行时尝试插入第一组参数

....
// 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();
....
在OleDb中,参数不是通过名称识别的,而是通过其位置识别的。
添加与第一次插入相关的第一个参数块意味着OleDb将在执行最终插入时,将添加到集合中的第一个参数(@AUDFIL_TT)作为第一个参数占位符(@AUDFIL_ID)的值。幸运的是,数据类型不匹配,您会收到一条错误消息。如果碰巧所有类型的数据都是正确的,那么您可能会在第二个表中输入错误的数据

个人提示:我不想以这种方式连接命令文本,而是更喜欢使用带@字符的。
我觉得它更可读

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)";

您对三个不同的执行使用相同的命令。问题是您没有清除parameters集合,因此在第三次执行时尝试插入第一组参数

....
// 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();
....
在OleDb中,参数不是通过名称识别的,而是通过其位置识别的。
添加与第一次插入相关的第一个参数块意味着OleDb将在执行最终插入时,将添加到集合中的第一个参数(@AUDFIL_TT)作为第一个参数占位符(@AUDFIL_ID)的值。幸运的是,数据类型不匹配,您会收到一条错误消息。如果碰巧所有类型的数据都是正确的,那么您可能会在第二个表中输入错误的数据

个人提示:我不想以这种方式连接命令文本,而是更喜欢使用带@字符的。
我觉得它更可读

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)";

首先,您可以显示您的模式吗?我认为第一个sql会失败。您没有为@AUDFIL_GENRE_ID提供值。首先,您是否可以显示您的模式?我认为第一个sql将失败。您没有为@AUDFIL\u GENRE\u ID提供值。