C# 并发冲突:UpdateCommand影响了预期的1条记录中的0条(Windows窗体中包含4列的简单1行表)

C# 并发冲突:UpdateCommand影响了预期的1条记录中的0条(Windows窗体中包含4列的简单1行表),c#,sqlite,concurrency,datatable,C#,Sqlite,Concurrency,Datatable,我有一个单行表,其中包含一些用于安装的标识值。它有一个主键列(值=1)和三个其他列 在初始应用程序启动时,我正在用新值更新三列。 但在更新时,我得到了上面的错误 数据没有绑定到表单控件-都在下面的代码中 我已经尝试删除PK,但是我无法使用SQL生成器 我添加了永不更改的PK列,而不是使用第一个数据列作为PK 我也试过用头撞砖墙,但也没用 SQLiteConnection cnWLLocal = new SQLiteConnection(); cnWLData.ConnectionString

我有一个单行表,其中包含一些用于安装的标识值。它有一个主键列(值=1)和三个其他列

在初始应用程序启动时,我正在用新值更新三列。 但在更新时,我得到了上面的错误

数据没有绑定到表单控件-都在下面的代码中

我已经尝试删除PK,但是我无法使用SQL生成器

我添加了永不更改的PK列,而不是使用第一个数据列作为PK

我也试过用头撞砖墙,但也没用

SQLiteConnection cnWLLocal = new SQLiteConnection(); 
cnWLData.ConnectionString = "Data Source=WordLightData.sqlite; Version = 3; DateTimeFormat=CurrentCulture ;"; 

string s = "Select Key, WLIdentity, WLIdentityCode, LastSongDBCheck from LocalInfo";
cmdLocalInfo = new SQLiteCommand(s, cnWLLocal);
daLocalInfo = new SQLiteDataAdapter(cmdLocalInfo);
dsLocalInfo = new DataSet();
daLocalInfo.Fill(dsLocalInfo, "LocalInfo");    // BTW this works perfectly - data is returned
bldLocalInfo = new SQLiteCommandBuilder(daLocalInfo);

dsLocalInfo.Tables["LocalInfo"].Rows[0]["WLIdentity"] = "New value";
dsLocalInfo.Tables["LocalInfo"].Rows[0]["WLIdentityCode"] = "New value";
dsLocalInfo.Tables["LocalInfo"].Rows[0]["LastSongDBCheck"] = Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd"));

DataSet dsChanges = new DataSet();
dsChanges = dsLocalInfo.GetChanges(DataRowState.Modified);
if (dsChanges != null)
{
daLocalInfo.UpdateCommand = bldLocalInfo.GetUpdateCommand();
int iRowsUpdated = daLocalInfo.Update(dsChanges, “LocalInfo”);
}
该表在SQLite中定义为:

键-整数PK

WLIdentity-字符串(20)

WLIdentityCode-文本(15)


LastSongDBCheck-整数(8)

您可以尝试以下代码:

        var cnWLLocal = new SQLiteConnection
        {
            ConnectionString = "Data Source=WordLightData.sqlite; Version = 3; DateTimeFormat=CurrentCulture ;"
        };


        const string s = "Select Key, WLIdentity, WLIdentityCode, LastSongDBCheck from LocalInfo";

        using (var cmdLocalInfo = new SQLiteCommand(s, cnWLLocal))
        {
            using (var daLocalInfo = new SQLiteDataAdapter(cmdLocalInfo))
            {
                using (var dsLocalInfo = new DataSet())
                {
                    daLocalInfo.Fill(dsLocalInfo, "LocalInfo");    // BTW this works perfectly - data is returned

                    using (var bldLocalInfo = new SQLiteCommandBuilder(daLocalInfo))
                    {
                        dsLocalInfo.Tables["LocalInfo"].Rows[0]["WLIdentity"] = "New value";
                        dsLocalInfo.Tables["LocalInfo"].Rows[0]["WLIdentityCode"] = "New value";
                        dsLocalInfo.Tables["LocalInfo"].Rows[0]["LastSongDBCheck"] = Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd"));

                        using (DataTable tableChanges = dsLocalInfo.Tables["LocalInfo"].GetChanges(DataRowState.Modified))
                        {
                            if (tableChanges != null)
                            {
                                daLocalInfo.UpdateCommand = bldLocalInfo.GetUpdateCommand();

                                int iRowsUpdated = daLocalInfo.Update(tableChanges);
                            }
                        }
                    }
                }
            }
        }

我已经解决了这个直接的问题——其中两列没有数据,所以是空的(我想)。我从后端向这些列中输入了一些虚拟数据,然后不再出现此错误。但我还是想知道如何解决这个问题!?这是一种相当麻烦的处理/存储日期时间的方法。一个普通的DateTime列不需要从字符串到int再到int再到日期的任何旋转,谢谢-我只是使用yyyymmdd与保存的值进行比较。日期时间只是一个方便的测试,我不需要复杂的日期/时间格式。:)你能告诉我这项技术有什么不同吗?它似乎只是说,只有在有更改时才更新表,中间三行必须有更改。daLocalInfo.UpdateCommand=bldLocalInfo.GetUpdateCommand()在using部分中是否会不同?Tksthis line SQLiteConnection cnWLLocal=新SQLiteConnection();cnWLData.ConnectionString=“数据源=WordLightData.sqlite;版本=3;DateTimeFormat=CurrentCulture;”;啊,是的,谢谢。我已经有了,但没有包括在我的样本中。谢谢你的建议。