忽略 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 字段?的主要内容,如果未能解决你的问题,请参考以下文章

SVN添加忽略后,怎么解除被忽略的文件

Sourcetree忽略文件

SVN添加忽略后,怎么解除被忽略的文件

SourceTree设置忽略文件

git 配置忽略文件规则

Java Socket 怎么忽略SIGPIPE信号