C#Access:INSERT SQL语句的条件表达式中的数据类型不匹配错误
我在这个网站上查过其他类似的问题,但他们的解决方案都不适合我 我正在使用C#中的SQL尝试将新记录插入本地Access数据库。目前,运行时出现错误 完整方法: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;
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提供值。