В настоящее время я работаю над инструментом, который удаляет некоторые XML-файлы из каталога и затем передает значения в базу данных.Каждый раз, когда я запускаю код, эти значения складываются в базе данных и появляются дубликаты.Эти файлы могут изменяться, поэтому код будет периодически запускаться для обновления базы данных, поэтому мне нужно придумать код, который удовлетворяет следующим условиям:
- Если значения, извлеченные из файлов XML,отличается от значения в базе данных, добавьте новую строку.
- Если значения, извлеченные из файлов XML, совпадают с данными из базы данных, перезапишите значения из базы данных.
- Если значения вбазы данных не были перезаписаны, пометить их как устаревшие.(поместите значение 1 или 0 в столбец с именем «Пометка»)
Теперь, когда я сделал краткое резюме того, что, по моему мнению, необходимо сделать, мы можем взглянуть на код.
foreach (var file in new DirectoryInfo(@"C:\GS1").GetFiles().OrderByDescending(f => f.LastWriteTimeUtc))
{
try
{
var xDocument = XDocument.Load(file.FullName);
foreach (XElement XE in xDocument.Descendants())
{
XE.Name = XE.Name.LocalName;
XE.ReplaceAttributes((from xattrib in XE.Attributes().Where(xa => !xa.IsNamespaceDeclaration) select new XAttribute(xattrib.Name.LocalName, xattrib.Value)));
}
var tradeItems = xDocument.Descendants().Where(f => f.Name == "tradeItem");
foreach (var tradeItem in tradeItems)
{
if (tradeItem.Elements().Any(f => f.Name == "isTradeItemAConsumerUnit" && bool.Parse(f.Value)))
{
...
var gtin = tradeItem.Elements().FirstOrDefault(f => f.Name == "gtin")?.Value?.Trim();
var ingredients = tradeItem.Descendants().FirstOrDefault(f => f.Name == "ingredientStatement")?.Value?.Trim();
var tradeMarket = tradeItem.Descendants().FirstOrDefault(f => f.Name == "tradeItemMarketingMessage")?.Value?.Trim();
Таким образом, приведенный выше код в значительной степени описывает, как я на самом деле собираю эти значения, которые потом хочу передать в базу данных.Некоторый код был опущен, но я хотел включить только самые важные вещи.
Затем я вызываю метод Save()
, который выглядит следующим образом:
private static void Save(FileInfo file, string gtin, string brandName, string partyName, string descriptionShort, string functionalName, string netContent, string fileName, string extension, byte[] image, string angle, DateTime? qualificationDate, string ingredients, DataTable nutritionFacts, string tradeMarket, string imageLink)
{
for(int i=0;i<3;i++)
{
try
{
using (SqlConnection conn = new SqlConnection("Server = xxxxxxxxx; Initial Catalog = dinkurv_dev; Persist Security Info = False; User ID = radu; Password =xxxxx;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"))
{
...
conn.Execute("INSERT INTO GS1MarketingInformation VALUES (@gtin, @tradeMarket)", new { gtin, tradeMarket });
conn.Execute("IF EXISTS(SELECT * from GS1IngredientInformation WHERE GTIN=@gtin) UPDATE GS1IngredientInformation SET GTIN=@gtin, @Ingredient_Information=@ingredients" +
"ELSE INSERT INTO GS1IngredientInformation VALUES (@gtin, @tradeMarket)", new { gtin, ingredients });
break;
}
}
catch (Exception exc)
{
}
}
}
Итак, как вы можете видеть выше,в методе Save у меня есть две строки:
conn.Execute("INSERT INTO GS1MarketingInformation VALUES (@gtin, @tradeMarket)", new { gtin, tradeMarket });
, которые вставляют все в базу данных, не принимая во внимание уже существующие значения.Поэтому я придумал вторую строку:
conn.Execute("IF EXISTS(SELECT * from GS1IngredientInformation WHERE GTIN=@gtin) UPDATE GS1IngredientInformation SET GTIN=@gtin, @Ingredient_Information=@ingredients" +
"ELSE INSERT INTO GS1IngredientInformation VALUES (@gtin, @tradeMarket)", new { gtin, ingredients });
, которая является попыткой перезаписать данные, которые уже есть в базе данных, при добавлении новых значений, если их там еще нет.Тем не менее, второй код на самом деле не работает должным образом.Из того, что я видел, он просто отбрасывает каждую строку, а затем заменяет ее другим набором значений.
В заключение: как мне переписать код выше, чтобы он соответствовал трем условиям, о которых я говорил?Я чувствую, что я достаточно близок к достижению перезаписи, но мои ограниченные знания SQL как бы тянут меня назад.