我有一个适用于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接口实现的正确对象。
答案 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);
}
}