忽略 MySqlDataAdapter.Update(DataTable) 中的 DATETIME 字段?
Posted
技术标签:
【中文标题】忽略 MySqlDataAdapter.Update(DataTable) 中的 DATETIME 字段?【英文标题】:Ignore DATETIME fields in MySqlDataAdapter.Update(DataTable)? 【发布时间】:2014-06-09 18:41:47 【问题描述】:我有一个与 Sql Server 配合使用的应用程序。我有一个 DevExpress 网格,它只显示轮播模式下的记录(我希望这并不重要)。
现在,我已将代码更改为与数据库无关,并且正在测试 mysql。当用户修改记录并接受更改时,我收到以下错误:
并发冲突:UpdateCommand 影响了预期的 1 中的 0 记录
经过一些研究,我得出的结论是问题出在 DATETIME 字段中。我正在使用“允许零日期时间=假;转换零日期时间=真;”在我的 MySql 连接字符串中,因此我可以将默认 DATETIME 值转换为 .Net DateTime 对象。自动生成的 UpdateCommand 包括 where 子句中的每个字段,我猜当 MySql DATETIMEs 设置为默认值时比较失败,因为删除 DATETIME 字段问题就消失了。
我有一个主键列,并且不允许用户修改它,那么发出自定义 UpdateCommand 以使 WHERE 子句中只有一个字段的正确方法是什么?
我当前接受更改的代码:
Dim builder As DbCommandBuilder = m_Conn.CreateCommandBuilder(m_Adapter)
m_Adapter.Update(m_DataTable)
CreateCommandBuilder 是 IDbConnection 上的扩展方法,用于创建具有正确实现 DbCommandBuilder 接口的对象。
【问题讨论】:
【参考方案1】:您的 DBCommandBuilder 应该有一个需要设置的 ConflictOption 属性。 大概您想将其设置为 ConflictOption.OverwriteChanges。
我不确定当您通过 CommandBuilder 构造函数初始化适配器命令时它是否有效,但是
var builder = new MySqlCommandBuilder();
builder.ConflictOption = ConflictOption.OverwriteChanges;
builder.DataAdapter = m_Adapter;
应该这样做。
【讨论】:
【参考方案2】:我建议您使用 DateTime.Parse(value),而不是在您的连接字符串中使用 "Allow Zero Datetime=False; Convert Zero Datetime=True;"
(仅供参考)。您可能想要编写一个函数,以便您也可以轻松处理空值。
private DateTime getDateTimeField(string dbValue)
if (dbValue == null)
return new DateTime();
else
return DateTime.Parse(dbValue);
【讨论】:
非常感谢@ErikusMaximus,但这并不能解决我的问题。如果我手动访问数据,您的答案将有效。但是,如果我不指定那些零日期时间选项,当我尝试为其分配 DataSource 时,网格会引发异常。以上是关于忽略 MySqlDataAdapter.Update(DataTable) 中的 DATETIME 字段?的主要内容,如果未能解决你的问题,请参考以下文章