Как перезаписать строки в базе данных при передаче значений из консольного приложения? - PullRequest
0 голосов
/ 26 сентября 2019

В настоящее время я работаю над инструментом, который удаляет некоторые XML-файлы из каталога и затем передает значения в базу данных.Каждый раз, когда я запускаю код, эти значения складываются в базе данных и появляются дубликаты.Эти файлы могут изменяться, поэтому код будет периодически запускаться для обновления базы данных, поэтому мне нужно придумать код, который удовлетворяет следующим условиям:

  1. Если значения, извлеченные из файлов XML,отличается от значения в базе данных, добавьте новую строку.
  2. Если значения, извлеченные из файлов XML, совпадают с данными из базы данных, перезапишите значения из базы данных.
  3. Если значения вбазы данных не были перезаписаны, пометить их как устаревшие.(поместите значение 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 как бы тянут меня назад.

...