2017-02-14 2 views
-1

У меня есть файл CSV, содержащий все продукты, из которых у меня есть метод в новом классе преобразовывая их в C# объекты продуктов, которые получают хранящимся в переменной типа IEnumerable:Populate базы данных с IEnumerable объектов из CSV файла

public class ReadCSVFile 
{ 
    public List<Product> ProductsList; 

    public ReadCSVFile() 
    { 

     var path = @"/Content/TrendyDinersLimited_Self_ProductUpdateTemplate.csv"; 

     var CSVProducts = from line in File.ReadAllLines(path).Skip(1) 
          let columns = line.Split(',') 
          select new Product 
          { 
           Id = int.Parse(columns[0]), 
           Name = columns[1], 
           Price = int.Parse(columns[4]) 
          }; 
    } 
} 

Мой вопрос в том, что теперь у меня есть список продуктов из файла CSV, как я должен заполнить их в моей базе данных (в качестве одноразового импорта)? Обычно администратор сначала создает категорию, затем выбирает категорию для добавления продуктов.

Я использую шаблон ASP.NET MVC в Visual Studio, и у меня есть три основных контроллера: HomeController (отображает категории и продукты), CategoryController (Admin Authorized), ProductController (Admin Authorized). Я также использую строку прямого подключения к Microsoft SQL Server.

+1

ли вы используете ORM или прямое соединение с базой данных? –

+0

Последнее - прямое подключение к базе данных. – naz786

ответ

2

У вас есть два варианта. Если вы пишете код как единую утилиту импорта, вы можете напрямую подключиться к SQL Server для вставки данных.

 string sqlInsertStmt = "INSERT INTO PRODUCT (id,name,price) VALUES (@id, @name, @price)"; 
     string connectionString = "sqlserver connection string"; 

     //sample connection string can be like 
     //connectionString="Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=False;User Id=userid;Password=password;MultipleActiveResultSets=True"; 

     using (SqlConnection conn = new SqlConnection(connectionString)) 
     { 
      conn.Open(); 
      foreach (var product in CSVProducts) 
      { 
       using (SqlCommand cmd = new SqlCommand()) 
       { 
        cmd.Connection = conn; 
        cmd.CommandText = sqlInsertStmt; 
        cmd.Parameters.AddWithValue("@id", product.Id); 
        cmd.Parameters.AddWithValue("@name", product.Name); 
        cmd.Parameters.AddWithValue("@val", product.Price); 
        try 
        { 
         cmd.ExecuteNonQuery(); 
        } 
        catch(SqlException e) 
        { 
         //log exception and handle error 
        } 
       } 
      } 
     } 

Примеры SQL server connection strings

Но если вы хотите что-то более ремонтопригодны, вы можете использовать Ef6 в качестве ORM слоя. Прочитайте эту статью, которая объясняет, как get started with EF6 and existing database

+0

Я пытаюсь это сделать, но вы имели в виду cmd.CommandText, а не cmd.CommandString? – naz786

+1

Да, это текст команды ... извините за опечатку. Я обновил свой ответ – Vinod

+0

Вы можете вызвать его внутри ReadCSVFile после чтения данных в переменную CSVProducts. Вы также можете вызвать класс ProductLoader. Плохая практика заключается в выполнении некоторых тяжелых операций внутри метода конструктора. Вероятно, вы должны создать два метода. GetProducts, который возвращает List of Product, а затем другой метод SaveProducts, который принимает список продуктов в качестве входных данных и выполняет сохранение в базе данных. Затем вызовите эти два метода из своего бизнес-уровня или контроллера MVC. – Vinod

3

Лично я использовал бы Dapper.Net для чего-то простого.

Если использование Dapper.Contrib (https://www.nuget.org/packages/Dapper.Contrib/) вы можете украсить свой класс с таблицей и ключевыми атрибутами, чтобы сделать жизнь проще для себя

[Table ("Products")] 
public class Product 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Price { get; set; } 
} 

Затем вы можете вставить как это

var connString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString; 
    using (var connection = new SqlConnection(connString)) { 
     foreach(var product in CSVProducts){   
      connection.Insert(product); 
     } 
    }