【发布时间】:2026-01-18 00:10:01
【问题描述】:
我正在使用 MS Access 文件作为数据库来开发 Visual Studio 2012,但在插入时遇到了很多问题:
cmd.Parameters.Add(new OleDbParameter("@codigo", cal.CodEtiq)); // Value = int
cmd.Parameters.Add(new OleDbParameter("@data", cal.Data.ToString("yyyy-MM-dd hh:mm"))); //Value = 2013-10-29 00:00
cmd.Parameters.Add(new OleDbParameter("@entidade", cal.EntidadeCal)); // Value = string
cmd.Parameters.Add(new OleDbParameter("@observacao", cal.Observacao)); // Value = string
cmd.Parameters.Add(new OleDbParameter("@certificado", cal.Certificado)); // Value = string
cmd.Parameters.Add(new OleDbParameter("@resultado", cal.Resultado)); // Value = string
cmd.Parameters.Add(new OleDbParameter("@selecionar", cal.Selecionar));// Value = int
cmd.Parameters.Add(new OleDbParameter("@null", DBNull.Value));
cmd.CommandText = "INSERT INTO [Movimento Ferramentas] VALUES (@codigo, CAST(@data AS DATETIME), @entidade, @null, @null, 'Calibração', @null, @observacao, @null, @certificado, @resultado, @selecionar, @null)";
表格是这样定义的(column = fieldtype):
- Codigo = 文本
- 数据说(又名@data)=日期/小时
- Entidade = 文本
- 数据条目 = 数据/小时
- GT Ent = 文本
- Estado = 文本
- GT saida = 文本
- 观察=文本
- requisitante = 号码
- 证书 = 文本
- 结果 = 文本
- 选择 = 是/否
- 提示 int = 文本
首先我收到一条错误消息,说“标准表达式中的数据类型不匹配”,然后我查找了日期的演员表并这样写,现在它给了我一个错误,上面写着“语法错误(缺少运算符) 查询表达式中的 CAST(@data AS DATETIME)"
请帮忙。
更新:正如@Ralph 所建议的,我实际上只需将所有空值都设为nulls,而不是使用"@null", DBNull.Value。所以,问题解决了谢谢大家。
【问题讨论】:
-
我会说问题出在第二个参数上,如果数据库列定义为日期时间,请不要将其转换为字符串。此外,您可以使用 OleDbParameter 的其他构造函数之一,以便您可以指定参数的类型 - 检查 msdn.microsoft.com/en-us/library/…
-
没有 .ToString("yyyy-MM-dd hh:mm") 和 Cast 我仍然会收到“标准表达式中的数据类型不匹配”错误
-
您是否按照我的建议尝试过使用其他 OleDbParameter 构造函数重载之一?您可以指定参数的类型,这应该可以解决问题。检查我在之前评论中添加的链接。
-
我检查过了。问题是其他构造函数变得过于复杂。正如你所说的这种情况,我只需要字符串、类型和对象本身。最接近的是“OleDbParameter(String, OleDbType, Int32, ParameterDirection, Boolean, Byte, Byte, String, DataRowVersion, Object)”。
-
参数集合有一个简单的 Add(name, type) 重载。但是 OleDB 对命名参数一无所知。您需要按照它们在 sql 字符串中定义的顺序添加它们。而且您也不能重用参数。您必须像在 sql 中一样经常添加@@null。为什么不直接写 null 而不是 @@null 呢?