Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的数据网格&x27;从网格';s绑定的数据集。有解决办法吗?_C#_Ado.net_Datagrid_Concurrency_Dataset - Fatal编程技术网

C# 我的数据网格&x27;从网格';s绑定的数据集。有解决办法吗?

C# 我的数据网格&x27;从网格';s绑定的数据集。有解决办法吗?,c#,ado.net,datagrid,concurrency,dataset,C#,Ado.net,Datagrid,Concurrency,Dataset,我正在使用Xceed的Datagrid,它绑定到一个数据集。我想在调用datagrid的RowEditEnd时更新数据库。问题是,为了避免更新时并发冲突,我必须在更新后清除数据集并重新填充,如下所示: public void UpdateDatabaseFromDataSet() { adapter.Update(exampleDataSet); exampleDataSet.Clear(); adapter.Fill(exampleDataSet); } 我想我必须这

我正在使用Xceed的Datagrid,它绑定到一个数据集。我想在调用datagrid的RowEditEnd时更新数据库。问题是,为了避免更新时并发冲突,我必须在更新后清除数据集并重新填充,如下所示:

public void UpdateDatabaseFromDataSet()
{
    adapter.Update(exampleDataSet);
    exampleDataSet.Clear();
    adapter.Fill(exampleDataSet);
}
我想我必须这样做,因为我的数据集的主自动增量列“ID”与数据库生成的值不匹配。当我清除数据集时,它会清除datagrid及其选定的单元格。这非常烦人,因为如果编辑单元格并按enter键或方向键,单元格和数据库将正常更新,但您的选择将重置,而不是导航到下一行/单元格。这使得手工输入数据非常麻烦

以下是创建数据集的方法:

public void InitDataSet(int tableid)
{
    cmd = new SQLiteCommand("SELECT * FROM table_" + tableid, con);
    adapter = new SQLiteDataAdapter(cmd);
    cb = new SQLiteCommandBuilder(adapter);

    try
    {

        exampleDataSet = new DataSet();

        adapter.Fill(exampleDataSet);
        prodDataSet.Tables[0].Columns[0].AutoIncrementSeed = -1;
        prodDataSet.Tables[0].Columns[0].AutoIncrementStep = -1;

        currenttableID = tableid;
    }
    catch (ApplicationException ex)
    {
        MessageBox.Show("Encountered an error.", "Error: " + ex.ToString());
    }
}
请注意,我已尝试将表autoincrementseed和autoincrementsteps设置为-1,但如果不重新填充数据集,仍然会出现并发冲突

如果我不清除并重新填充数据集,我真的希望我的datagrid能够像它那样工作。是否有任何方法可以避免我遇到的并发冲突?我走错方向了吗

谢谢你的帮助。
-史蒂文

我并不完全理解这个问题,但我也许能给你一些东西
当您不清除数据集并调用“fill”时,它将尝试将数据库中的记录与现有记录“合并”。我想,清除会迫使网格刷新。。丢失所选行


Adapter.FillLoadOption=LoadOption.PreserveChanges(或其他)
您可以影响数据库中已更改的记录与数据集合并的方式。


现在还有一个问题,那就是在插入时确定新的autoinc值。您可以捕获适配器。行更新

void Adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
        {
            if (e.StatementType==StatementType.Insert)
            {

                Select last autoinc value with @@Identity  
                e.Row["ID"] = last autoinc value
            } 
        }
因此:

  • 不清除数据表
  • 捕获更新的行并获取数据库中最新的autoinc值,将其放入新行
  • Evt。调用fill查看其他用户是否进行了更改

这是最终为我工作的代码,将它放在这里是为了其他人的利益

以下是我的数据提供程序更新方法(请注意,我能够删除额外的填充调用):

下面是我正在使用的RowUpdate事件:

void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)
{
    if (e.StatementType == StatementType.Insert)
    {
        SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con);
        e.Row["RowID"] = cmdNewID.ExecuteScalar();
    }
}

是的,我很抱歉这个问题不太清楚。非常感谢你的建议,看来它们可以解决我的问题。下周我到家后,我会试试你的建议,告诉你进展如何。再次感谢。我接受了你的回答,因为你给我指出了正确的方向。非常感谢你的帮助,朱利安。我发布了下面另一个答案中使用的实际代码。再次感谢!
void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)
{
    if (e.StatementType == StatementType.Insert)
    {
        SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con);
        e.Row["RowID"] = cmdNewID.ExecuteScalar();
    }
}