2

我正在使用 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 文件中的新值更新这一行,如果没有使用主键,那么它会像原始代码一样(只需添加行),我应该在哪里编写代码来检查该行是否已经存在?

4

2 回答 2

2

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

有关示例,请参见http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/

于 2013-01-26T13:54:34.717 回答
1

我建议您创建一个Stored Procedureto Updateif 存在和Insertif 不存在。虽然我认为这种方法不适用于SqlBulkCopy,但您必须一一插入行。

于 2013-01-26T13:49:56.540 回答