C# 恢复备份时如何更新?

C# 恢复备份时如何更新?,c#,.net,sql-server,C#,.net,Sql Server,我正在使用c#在.net中构建一个Web应用程序。 我上传备份文件(csv文件)的代码有问题 代码如下: protected void UploadBackup(object sender, EventArgs e) { SqlConnection con = new SqlConnection(dataset1.ConnStr); string filepath = ""+Server.MapPath("/backups/Species.

我正在使用c#在.net中构建一个Web应用程序。 我上传备份文件(csv文件)的代码有问题

代码如下:

        protected void UploadBackup(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(dataset1.ConnStr);
        string filepath = ""+Server.MapPath("/backups/Species.csv");
        StreamReader sr = new StreamReader(filepath);
        string line = sr.ReadLine();
        string[] value = line.Split(',');
        DataTable dt = new DataTable();
        DataRow row;
        foreach (string dc in value)
        {
            dt.Columns.Add(new DataColumn(dc));
        }

        while (!sr.EndOfStream)
        {
            value = sr.ReadLine().Split(',');
            if (value.Length == dt.Columns.Count)
            {
                row = dt.NewRow();
                row.ItemArray = value;
                dt.Rows.Add(row);
            }
        }
        SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
        bc.DestinationTableName = "Species";
        bc.BatchSize = dt.Rows.Count;
        con.Open();
        bc.WriteToServer(dt);
        bc.Close();
        con.Close();
    }
当我点击某个按钮,它连接到我的数据库并恢复物种表中的所有行时,这段代码就可以正常工作了

这是我的问题: 当我在这个表中有值时,它将返回一个错误,因为主键已经被使用了。
我想做的是,当一些主键已经被取下时,它将用csv文件中的新值更新此行,如果主键没有被取下,它将像原始代码一样(只需添加行),我应该在哪里编写代码来检查行是否已经存在

我建议您创建一个
存储过程
更新
(如果存在)和
插入
(如果不存在)。虽然我认为这种方法不适用于
SqlBulkCopy
,但您必须逐个插入行。

将记录插入临时表,然后发出merge sql命令将数据合并到现有表中

请参阅以获取示例