我正在使用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文件中的新值更新此行,如果未采用主键,则它将像原始代码一样(只需添加行),我应该在哪里编写代码来检查行是否已经存在?
答案 0 :(得分:2)
将记录插入临时表,然后发出merge sql命令将数据合并到现有表中。
请参阅http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/以获取示例
答案 1 :(得分:1)
我建议你创建一个Stored Procedure
到Update
如果存在,Insert
如果不存在。虽然我不认为这种方法适用于SqlBulkCopy
,但您必须逐个插入行。