首页 > 解决方案 > 如何在写入表之前检查数据是否存在

问题描述

我有一个 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();
            }

标签: c#sqlsql-serverprimary-key

解决方案


使用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

推荐阅读