2017-02-14 70 views
-1

我有一個包含從我有一個新的類中的方法的所有產品將它們轉換成獲取存儲在IEnumerable類型的變量C#Product對象的CSV文件:填充數據庫從CSV IEnumerable的對象文件

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文件的產品列表,我應該如何將它們填充到我的數據庫(作爲一次導入)?通常,管理員會先創建一個類別,然後點擊一個類別來添加產品。我有三個主要控制器:HomeController(顯示類別和產品),CategoryController(管理員授權),ProductController(管理員授權)。我使用的是ASP.NET MVC模板。我也使用直接連接字符串到Microsoft SQL Server。

+1

是你使用ORM還是直接連接數據庫? –

+0

後者 - 直接連接到數據庫。 – naz786

回答

2

你有兩種選擇。如果您將代碼編寫爲一次性導入實用程序,則可以直接連接到SQL Server以插入數據。對於SQL server connection strings

 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 
        } 
       } 
      } 
     } 

例子,但如果你想要的東西更容易維護,你可以使用EF6作爲你的ORM層。 請閱讀這篇文章,解釋如何get started with EF6 and existing database

+0

我正在嘗試這個,但是你的意思是cmd.CommandText而不是cmd.CommandString? – naz786

+1

是的,這是命令文本...抱歉的錯字。我已經更新了我的回答 – Vinod

+0

在將數據讀入CSVProducts變量後,您可以在ReadCSVFile中調用它。你可以稱之爲ProductsLoader類。在構造函數方法中執行一些繁重的操作是不好的做法。你應該可能創建兩種方法。 GetProducts返回產品列表,然後是另一個名爲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); 
     } 
    }