Добавление несуществующих данных в datatable в базу данных без удаления существующих данных

#c# #sql

#c# #sql

Вопрос:

У меня есть datatable, пример данных выглядит следующим образом:
введите описание изображения здесь.

Мне нужно добавить другие данные, подобные этому:

введите описание изображения здесь.

Как я могу добавить эти новые данные из datatable в базу данных без удаления существующих данных?
Вот мой пример кода, но этот код сохраняет все данные в таблице данных, поэтому он создает дубликаты данных в базе данных.

 if (dtEmailAddress.Rows.Count>0)
        {
            string strDBConfig = Application.StartupPath   @"MedXPro.xml";
            string sql = "INSERT INTO AgencyEmailAddress (AgencyID, EmailAddress) VALUES (@AgencyID, @EmailAddress)";
            using (SqlConnection conn = PSCSClass.DataConnections.MDFConnection("", "", false, "", "", strDBConfig))
            {
                foreach (DataRow row in dtEmailAddress.Rows)
                {
                    SqlCommand cmd = conn.CreateCommand();
                    cmd.CommandText = sql;
                    cmd.Parameters.AddWithValue("@AgencyID", row["AgencyID"]);
                    cmd.Parameters.AddWithValue("@EmailAddress", row["EmailAddress"]);
                    cmd.ExecuteNonQuery();
                }
            }
            dtEmailAddress.Rows.Clear();
        }
 

Ответ №1:

Основная идея состоит в том, чтобы проверить наличие и обновить или создать в одном операторе SQL. Что-то вроде этого:

 BEGIN TRANSACTION;
UPDATE dbo.AgencyEmailAddress SET EmailAddress WHERE AgencyID = @agencyId;
IF @@ROWCOUNT = 0
BEGIN
  INSERT dbo.AgencyEmailAddress(AgencyID, EmailAddress) 
      SELECT @agencyId, @emailAddress;
END
COMMIT TRANSACTION;
 

Поскольку выполнение этого из кода C # может быть очень неудобным, я бы создал процедуру UpdateAgency и вызвал ее из C #.

Комментарии:

1. Привет, сэр, когда я пробую этот код, он запускается, но никаких изменений в базе данных нет, вот мой код.

2. SqlCommand sqlcmd = новая SqlCommand(«saveEmail», sqlcnn); sqlcmd. Параметры. Добавить(новый SqlParameter(«@agencyID», строка[«AgencyID»])); sqlcmd. Параметры. Добавить(новый SqlParameter(«@EmailAddress», строка[«EmailAddress»])); sqlcmd. Параметры. Добавить(новый SqlParameter(«@@ROWCOUNT», dtEmailAddress.Rows. Count)); sqlcmd. CommandType = CommandType . StoredProcedure;

3. SqlDataReader sqldr = sqlcmd. ExecuteReader();

Ответ №2:

Я ОБНОВИЛ СВОЙ ОТВЕТ ПОСЛЕ ПОВТОРНОГО ПРОЧТЕНИЯ ВОПРОСА Извините, я неправильно понял первоначальную проблему

Вы можете проверить наличие данных в том же запросе следующим образом:

 IF NOT EXISTS (SELECT * FROM AgencyEmailAddress WHERE EmailAddress = @EmailAddress)

    INSERT INTO AgencyEmailAddress (AgencyID, EmailAddress) VALUES (@AgencyID, @EmailAddress)
 

Комментарии:

1. это выдает ошибку, сэр. извините, я только новичок в C#

2. ДА. В основном проверяет, есть ли значение в БД, если нет, выполняется ВСТАВКА

3. имя «НЕ» не существует в текущем контексте