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

时间:2014-04-24 12:56:46

标签: c# mysql datatable

我有一个适用于Sql Server的应用程序。我有一个DevExpress网格,它只显示轮播模式中的记录(我希望这不重要)。

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

  

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

经过一番研究,我得出结论,问题出在DATETIME领域。我正在使用"允许零日期时间=假;转换零日期时间=真;"在我的MySql连接字符串中,所以我可以将默认的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接口实现的正确对象。

2 个答案:

答案 0 :(得分:1)

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

我不确定当你通过CommandBuilder构造函数初始化适配器命令时它是否有效

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

应该这样做。

答案 1 :(得分:1)

我建议不要在你的连接字符串中使用"Allow Zero Datetime=False; Convert Zero Datetime=True;"(我不熟悉),我建议使用DateTime.Parse(value)。您可能想要编写一个函数,以便您也可以轻松处理空值。

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