c# - 如何在写入表之前检查数据是否存在
问题描述
我有一个 SQL 命令,它将数据插入到SSMS
名为FileTrackLog
.
每次我插入重复数据时,我的应用程序都会崩溃,因为 [Path] 字段是primary key
.
如何检查如何不重新添加已经存在的数据,而不会使我的应用程序崩溃?
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd =
new SqlCommand(
"INSERT INTO [FileTrackLog] (Date, Client, Path, DateAddedToDb) " + // Dont foreget to add "DateAddedToDb" later when going live
" VALUES (@Date, @Client, @Path, @DateAddedToDb)"); // Dont foreget to add @"DateAddedToDb" later when going live
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.Parameters.Add("@Date", DbType.DateTime);
cmd.Parameters.Add("@Client", DbType.String);
cmd.Parameters.Add("@Path", DbType.String);
cmd.Parameters.Add(@"DateAddedToDb",DbType.DateTime);
foreach (var extractedRecord in extractedList)
{
cmd.Parameters[0].Value = extractedRecord.Date;
cmd.Parameters[1].Value = extractedRecord.Client;
cmd.Parameters[2].Value = extractedRecord.Path;
cmd.Parameters[3].Value = DateTime.Now;
cmd.ExecuteNonQuery();
}
conn.Close();
}
解决方案
使用EXISTS
,我们可以检查该值是否已经存在。
如果该值已经存在,则跳过插入进度。
尝试这个:
IF NOT EXISTS(SELECT 1 FROM [FileTrackLog] WHERE YourPrimaryKeyColumn = @PrimaryKeyInput)
BEGIN
INSERT INTO [FileTrackLog] (Date, Client, Path, DateAddedToDb)
VALUES (@Date, @Client, @Path, @DateAddedToDb)
END
推荐阅读
- typescript - 如何从 TypeScript 的接口中提取“路径表达式”?
- javascript - 使用以编程方式分派的事件防止默认操作
- django - NOT NULL 约束失败:api_student.author_id
- java - Java 线程实现
- c - 自动换行到文件的问题
- php - 论坛在发送消息时重定向到主页,用户名未显示
- python - 在 csv 数据上应用 textblob 正确方法时如何减少 python 中的执行时间?
- html - 是否可以创建虚线框阴影?
- javascript - gtag 为一次通话发送两个事件
- time - 在 Ubuntu 中禁用 DST 时间更改或禁用 zoneinfo 文件更新