@Senia_sweety

Конвертация xml в sql (code first или напрямую через SQL)?

Вооообщем, всем доброго времени суток дорогие шарписты.
Проблема, есть файл XML допустим с сайта cbr.ru. Я хотел бы перенести информацию из файла в SQl Server, что-бы потом через MVC показать результаты и (или) историю изменений. Варианты которые меня привели в никуда:
1) функция OPENROWSET в SQL, она создаёт гиперссылку для xml и соответственно просто показывает код XML-файла
2) Костыльный Code FIrst
using (AppDbContext context = new AppDbContext())
            {

                while (reader.Read())
                {
                    Test test = new Test();
                    reader.ReadStartElement();
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Valute"))
                    {
                        if (reader.HasAttributes)
                        {
                            test.ValuteID = reader.GetAttribute("ID");
                        }
                    }
                    reader.ReadToDescendant("NumCode");
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "NumCode"))
                    {
                        test.NumCode = Convert.ToInt32(reader.ReadInnerXml());
                    }
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "CharCode"))
                    {
                        test.CharCode = Convert.ToString(reader.ReadInnerXml());
                    }
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Nominal"))
                    {
                        test.Nominal = Convert.ToInt32(reader.ReadInnerXml());
                    }
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Name"))
                    {
                        test.Name = Convert.ToString(reader.ReadInnerXml());
                    }
                    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Value"))
                    {
                        test.Value = Convert.ToDecimal(reader.ReadInnerXml());
                    }
                    listTest.Tests.Add(test);
                }
              context.ListTests.Add(listTest);
              await context.SaveChangesAsync();
           }

Проблема здесь в том что создаются ненужные объекты в которых не содержатся необходимая информация, попросту пустышки.
Классы для передачи данных в БД:
public class Test
    {
        public int Id { get; set; }
        public string ValuteID { get; set; }
        public int NumCode { get; set; }
        public string CharCode { get; set; }
        public int Nominal { get; set; }
        public string Name { get; set; }
        public decimal Value { get; set; }
        public ListTest ListTest { get; set; }
    }
    public class ListTest
    {
        public int Id { get; set; }
        
        public List<Test> Tests { get; set; } = new List<Test>();
        
    }
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Senior .NET developer
Прямая загрузка xml
https://www.mssqltips.com/sqlservertip/5707/simple...
Выполнение кода
using(var context = new SampleContext())
{
    var commandText = "INSERT Categories (CategoryName) VALUES (@CategoryName)";
    var name = new SqlParameter("@CategoryName", "Test");
    context.Database.ExecuteSqlCommand(commandText, name);
}


Десириализация, без лишних движений
https://docs.microsoft.com/ru-ru/dotnet/api/system...

В общем вариантов куча.

public class SqlItem
        {
            public SqlItem() { }

            public SqlItem(XmlItem item)
            {
                Name = item.Name;
            }
            public string Name { get; set; }
        }

            using var ctx = new ApplicationDbContext(new Microsoft.EntityFrameworkCore.DbContextOptions<ApplicationDbContext>());
            var serializer =new XmlSerializer(typeof(XmlItem[]));
            var filename = "test.xml";
            var fs = new FileStream(filename, FileMode.OpenOrCreate);
            var reader = new StreamReader(fs);
            var xmls = (XmlItem[])serializer.Deserialize(reader);
            foreach (var item in xmls)
                ctx.Items.Add(new SqlItem(item));
            ctx.SaveChanges();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы