【问题标题】:Error Inserting Cast data and null fields C#插入 Cast 数据和空字段 C# 时出错
【发布时间】: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 呢?

标签: c# .net sql ado.net oledb


【解决方案1】:

看到这个...

enter code here

如果日期为空,则为日期时间变量分配空 使用 dbnull.value

 if (@data== null)
 {
    new OleDbParameter("@Dt", SqlDbType.DateTime).Value =DBNull.Value;
 }
else
{
    new OleDbParameter(("@Dt", SqlDbType.DateTime).Value = @data;
}

【讨论】: