#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. имя «НЕ» не существует в текущем контексте