忽略MySqlDataAdapter.Update(DataTable)中的DATETIME字段

本文关键字:中的 DATETIME 字段 DataTable MySqlDataAdapter Update 忽略 | 更新日期: 2023-09-27 17:59:45

我有一个应用程序,它可以很好地与Sql Server配合使用。我有一个DevExpress网格,它只显示旋转木马模式下的记录(我希望这并不重要)。

现在,我已经将代码更改为与数据库无关,并且正在测试MySql。当用户修改记录并接受更改时,我得到了以下错误:

并发冲突:UpdateCommand影响了预期1中的0记录

经过一些研究,我得出结论,问题出在DATETIME字段中。我在MySql连接字符串中使用"Allow Zero Datetime=False;Convert Zero Datetime=True;",这样我就可以将默认的Datetime值转换为.Net Datetime对象。自动生成的UpdateCommand包括where子句中的每个字段,我猜当MySql DATETIME设置为默认值时,比较会失败,因为删除DATETIME字段问题就消失了。

我有一个主键列,用户不允许修改它,那么发出自定义UpdateCommand以使WHERE子句中只有一个字段的正确方法是什么?

我当前接受更改的代码:

Dim builder As DbCommandBuilder = m_Conn.CreateCommandBuilder(m_Adapter)
m_Adapter.Update(m_DataTable)

CreateCommandBuilder是IDbConnection上的一个扩展方法,用于使用DbCommandBuilder接口的正确实现创建正确的对象。

忽略MySqlDataAdapter.Update(DataTable)中的DATETIME字段

您的DBCommandBuilder应该有一个需要设置的ConflictOption属性。大概您想将其设置为ConflictOption.OverwriteChanges.

我不确定当您通过CommandBuilder构造函数而不是初始化Adapter命令时,它是否有效

var builder = new MySqlCommandBuilder();
builder.ConflictOption = ConflictOption.OverwriteChanges;
builder.DataAdapter = m_Adapter;

应该这样做。

与其在连接字符串中使用"Allow Zero Datetime=False; Convert Zero Datetime=True;"(仅供参考,我不熟悉),我建议使用DateTime.Parse(value)。您可能需要编写一个函数,以便也可以轻松处理null。

private DateTime getDateTimeField(string dbValue)
{
    if (dbValue == null)
    {
        return new DateTime();
    }
    else {
        return DateTime.Parse(dbValue);
    }
}