C#向Access插入日期时间报错,疑类型不匹配或SQL语法问题
问题排查与修复方案
核心问题分析
SQL语法错误(字段与值数量不匹配)
你的字段列表一共13个,但values里写了14个值——在kullanici后面多了一个空值占位(','),导致字段数和值数对应不上,这是直接触发报错的原因之一。日期类型处理错误
Access数据库的日期/时间类型需要用#包裹,而不是单引号'。你把日期转成字符串后用单引号包裹,会被识别为文本类型,和字段的日期类型不匹配,引发类型错误。字符串拼接SQL的隐患
直接拼接文本框内容等用户输入,不仅容易因为特殊字符(如单引号)导致SQL语法崩溃,还存在SQL注入风险。
修复后的代码(使用参数化查询)
using (var cmd = new OleDbCommand()) { con.Open(); cmd.Connection = con; // 修正字段与值的对应关系,移除多余的空值占位 cmd.CommandText = @"INSERT INTO kayit (evraktarihi, evrakgelistarihi, gelissaati, geldigiyer, konusu, faturano, htfno, talepno, satınpersonel, teslimkisi, yapılanislem, açıklama, islemtarih) VALUES (@evrakTarihi, @evrakGelisTarihi, @gelisSaati, @geldigiYer, @konusu, @faturaNo, @htfNo, @talepNo, @satinPersonel, @teslimKisi, @yapilanIslem, @aciklama, @islemTarih)"; // 添加参数,直接传入原生类型,无需手动格式转换 cmd.Parameters.AddWithValue("@evrakTarihi", dateTimePicker1.Value); cmd.Parameters.AddWithValue("@evrakGelisTarihi", DateTime.Today); cmd.Parameters.AddWithValue("@gelisSaati", DateTime.Now); // 若gelissaati是纯时间字段,可改用DateTime.Now.TimeOfDay cmd.Parameters.AddWithValue("@geldigiYer", textBox2.Text); cmd.Parameters.AddWithValue("@konusu", textBox3.Text); cmd.Parameters.AddWithValue("@faturaNo", textBox4.Text); cmd.Parameters.AddWithValue("@htfNo", textBox5.Text); cmd.Parameters.AddWithValue("@talepNo", textBox6.Text); cmd.Parameters.AddWithValue("@satinPersonel", textBox7.Text); cmd.Parameters.AddWithValue("@teslimKisi", kullanici); cmd.Parameters.AddWithValue("@yapilanIslem", textBox8.Text); // 原代码此处为空,若字段允许空可替换为DBNull.Value cmd.Parameters.AddWithValue("@aciklama", textBox1.Text); cmd.Parameters.AddWithValue("@islemTarih", dateTimePicker3.Value); cmd.ExecuteNonQuery(); con.Close(); }
额外说明
- 参数化查询会自动处理日期类型的格式适配,彻底避免类型不匹配问题。
- 注意
gelissaati字段的类型:如果是纯时间字段,传DateTime.Now.TimeOfDay(TimeSpan类型);如果是日期时间字段,直接传DateTime.Now即可。 - 若
yapılanislem字段允许空值,可将对应参数值改为DBNull.Value。
内容的提问来源于stack exchange,提问作者ismail YANIK
相关产品推荐
相关产品推荐

