还原备份时如何更新?

时间:2013-01-26 13:33:59

标签: c# .net sql-server

我正在使用c#在.net中构建webApp。 我的代码有问题,上传备份文件(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();
    }

当我点击某个按钮并且它连接到我的数据库并恢复Species表中的所有行时,此代码正常工作,它的工作正常。

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

2 个答案:

答案 0 :(得分:2)

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

请参阅http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/以获取示例

答案 1 :(得分:1)

我建议你创建一个Stored ProcedureUpdate如果存在,Insert如果不存在。虽然我不认为这种方法适用于SqlBulkCopy,但您必须逐个插入行。