插入 Cast 数据和空字段 C# 时出错
Posted
技术标签:
【中文标题】插入 Cast 数据和空字段 C# 时出错【英文标题】:Error Inserting Cast data and null fields C# 【发布时间】:2013-11-08 13:08:27 【问题描述】:我正在使用 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 呢? 【参考方案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;
【讨论】:
以上是关于插入 Cast 数据和空字段 C# 时出错的主要内容,如果未能解决你的问题,请参考以下文章
尝试将数据插入多个表时出错 [C# Winform SQL Server] [关闭]
c# 将数据类型 varchar 转换为 bigint 时出错
当我在 c# sql 的 listview 中插入多个产品时出错。怎么了?
插入数据时出错 java.time.LocalDate 在 SpringBoot 中包含字段 dateOfBirth 类型 LocalDate