我想使用C#和SQL Server 2000作为数据库插入多个记录(~1000)但在插入之前如何检查我插入的记录是否已经存在,如果是,则应插入下一条记录。记录来自结构化的Excel文件,然后我将它们加载到一个通用集合中并遍历每个项目并执行这样的插入
// Insert records into database
private void insertRecords() {
try {
// iterate through all records
// and perform insert on each iteration
for (int i = 0; i < names.Count; i++) {
sCommand.Parameters.AddWithValue("@name", Names[i]);
sCommand.Parameters.AddWithValue("@person", ContactPeople[i]);
sCommand.Parameters.AddWithValue("@number", Phones[i]);
sCommand.Parameters.AddWithValue("@address", Addresses[i]);
// Open the connection
sConnection.Open();
sCommand.ExecuteNonQuery();
sConnection.Close();
}
} catch (SqlException ex) {
throw ex;
}
}
此代码使用存储过程插入记录,但我可以在插入之前检查记录吗?
答案 0 :(得分:4)
在您的存储过程中,您可以进行类似这样的检查(猜测表名和列名,因为您没有指定):
IF EXISTS(SELECT * FROM dbo.YourTable WHERE Name = @Name)
RETURN
-- here, after the check, do the INSERT
您可能还想在Name
列上创建一个UNIQUE INDEX,以确保不存在具有相同值的两行:
CREATE UNIQUE NONCLUSTERED INDEX UIX_Name
ON dbo.YourTable(Name)
答案 1 :(得分:0)
在存储过程中,对于要添加到数据库的行,首先检查表中是否存在该行。如果它存在,UPDATE
,否则INSERT
。 SQL 2008还有MERGE
命令,它基本上可以更新并插入。
性能方面,RBAR(逐行排列)的效率非常低。如果速度是一个问题,你需要查看各种“一次插入大量行”的主题:BULK INSERT,bcp实用程序和SSIS包。你仍然有这两个问题,但至少它表现得更好。
编辑:
将数据批量插入空表很容易。在非空表中批量插入 new 数据非常简单。将数据批量插入到表中,其中某些数据(可能是由主键定义)已经存在,这很棘手。唉,具体步骤很快就会得到详细说明,并且非常依赖于您的系统,代码,数据结构等等。
要遵循的一般步骤是: - 创建临时表 - 将数据加载到临时表中 - 将临时表的内容与目标表的内容进行比较 - 它们匹配的地方(旧数据),更新 - 它们不匹配的地方(新数据),INSERT
我在SO上快速搜索了其他有关此内容的帖子,偶然发现了一些我从未想过的内容。试试this;它不仅有用,而且优雅。
答案 2 :(得分:0)
最简单的方法可能是在循环中有一个内部try
块。捕获任何数据库错误,如果它们不重复记录错误,则重新抛出它们。如果是重复记录错误,则不要做任何事情(吃掉例外)。
答案 3 :(得分:-1)
你的桌子有主键吗?如果是这样,您应该能够检查要插入的键值是否已经在表中。