-1

几个月前我编写了这个程序,用于分隔这些大.CSV文件并将它们上传到 SQL Server 数据库中。由于该.CSV文件基本上每次都附加新数据,因此我只是对其进行了设置,以便每次用户上传数据时,它都会从表中删除所有内容并上传新附加的数据,如下所示:

myConnection.Open();
string sql = @"DELETE FROM TestTable;";
SqlCommand cmd = new SqlCommand(sql, myConnection);
cmd.ExecuteNonQuery();
myConnection.Close();

现在我必须设置它来上传数据而不删除以前的条目到表中,但问题是我不能有重复的数据。幸运的是,该.CSV文件带有我用作主键的每一行的唯一标识符,但我无法提出算法来执行此操作。是否有类似于DELETE上述语法的东西可以与 SQL Server 一起使用以仅更新唯一数据?我问你们,因为在 SQL Server 方面我不是最大的专家。

我有几个不同的班级和后台工作人员,所以不想过去所有的代码,因为它很多,但如果你们需要任何细节,请告诉我。

编辑

这里有一个例子:http: //msdn.microsoft.com/en-us/library/y06xa2h1 (v=vs.80).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

我很确定我需要做什么,但我唯一感到困惑的是什么是 dataSet1 以及它来自哪里?我只是使用连接字符串来打开与 SQL Server 数据库的连接,然后使用它SqlDataAdapter来执行诸如插入和东西之类的功能。

如果有人对此有任何澄清,那将有很大帮助。

谢谢

4

1 回答 1

1

实现此目的的一种廉价方法是在 SQL Server 中的唯一标识列上创建一个唯一索引,并告诉它只是简单地忽略任何重复项。

CREATE UNIQUE INDEX UIX_YourIndexNameHere
ON dbo.YourTableNameHere(YourUniqueColumnNameHere)
WITH (IGNORE_DUP_KEY = ON);

这表示:

  • SQL Server 将只允许此列中的唯一值 - 没有重复
  • 如果插入了任何重复项,它们将被丢弃而不会引发任何错误(可以说是“默默地忽略”)

这也意味着:

  • 可能的重复将被忽略 - 该唯一 ID 的现有行将保持原样(无更新)
  • 正在插入新行

如果您需要使用其 ID 更新预先存在的行,我建议您这样做:

  • 将 .CSV 批量加载到临时登台表中
  • 使用MERGE命令(希望您使用的是 SQL Server 2008或更高版本!)从临时表更新真实表;这允许轻松插入新行并更新(而不是忽略)预先存在的行
于 2013-02-18T17:06:27.223 回答