C# 如何将数据表插入现有数据库并覆盖重复的数据表?

C# 如何将数据表插入现有数据库并覆盖重复的数据表?,c#,datatable,oledb,C#,Datatable,Oledb,我目前有一个数据表,它根据访问表行添加新行。在数据表中,我更改了某些列的值,并将它们更新回数据库。如果主键已经存在,我想写一行代码覆盖数据。我已经研究了一个查询在重复键UPDATE name=“a”,age=19上插入到表(id,name,age)值(1,“a”,19),但我找不到实现这一点的方法,因为我使用的是数据适配器 我制作了以下代码: for(int i=1;i

我目前有一个数据表,它根据访问表行添加新行。在数据表中,我更改了某些列的值,并将它们更新回数据库。如果主键已经存在,我想写一行代码覆盖数据。我已经研究了一个查询
在重复键UPDATE name=“a”,age=19
上插入到表(id,name,age)值(1,“a”,19),但我找不到实现这一点的方法,因为我使用的是数据适配器

我制作了以下代码:

for(int i=1;i<19;i++)
{
Normen.Clear();
标准添加(-1);
对于(int j=9;j<18;j++)
{
添加(Convert.ToInt32(NormDb.Rows[j].Field(i));
}
newRow[i]=Convert.ToInt32(GlobalMethods.LeftSegmentIndex(Normen,Convert.ToInt32(newRow[i+18]));
}
schoolDb.Rows.Add(newRow);
在本例中,
Normen
是一个包含整数的列表,我使用这些整数计算考试分数,然后将这些分数插入我从数据库表中获取的空列中

当这段代码运行时,我有一个datatable,其中的行和列与数据库列相同。完成此代码后,会触发另一种方法将数据更新到datatable中,如下所示:

使用(var-dbcommand=new-OleDbCommand(ZoekQuery,connection))
{
使用(var SchoolAdapter=新的OleDbDataAdapter(ZoekQuery,连接))
{
OleDbCommandBuilder cb=新的OleDbCommandBuilder(学校适配器);
cb.GetInsertCommand();
SchoolAdapter.FillSchema(schoolDb,SchemaType.Source);
schooldadapter.Fill(schoolDb);
Normeringen.Normeer(exportDb.Rows.Count、schoolDb、exportDb、NormDb、normcode);
schooldadapter.Update(schoolDb);
MessageBox.Show(成功);
}
}

但是当主键已经存在时,我想覆盖记录,因为在这个用例中,可以使用两个不同的值对测试进行评分。有什么方法可以实现这一点吗?

当数据库有主键时,您只能有一行具有相同键的数据库。所以你必须使用更新而不是插入。插入到一个临时表中,然后合并。是的,我有一个数据库,其中有导出数据而没有评分,还有一个学校数据库,其中有评分测试。在这种情况下,学生可能需要新的年级,因此在学校数据库中必须覆盖学生姓名。当我使用.Update命令插入行时,它将抛出一个不能重复的异常。@self您是指包含我需要插入的整个schooldb的临时数据表?您有一个数据表。而且,您没有添加或更新内容的上下文。因此,您必须检查每一行,以了解是否要更新或插入。连接并不便宜,你每次都会做一次往返。如果您不想处理上下文以及哪些数据是新的或需要更新的。(例如,EF将这样做,并且只提交更改/保存更改)。您可以bluck将数据插入临时表,并编写一条合并语句,该语句将处理“不匹配时插入”和“匹配时更新”