2017-02-14 72 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); 
     } 
    }