将列表中的值插入数据库

INSERT values from a list to database

我想解析一个 CSV 文件,将其存储在一个列表中,然后将该列表中的值插入到数据库中。这是我的代码示例。 我还在学习,所以如果不清楚,我会进一步解释。但我的想法是逐行解析 csv 文件,然后将每一行插入我的数据库中。提前谢谢你。

public class SKU : List<string[]>
{
    public string SKU_ID { get; set; }
    public string SKU_Name { get; set; }
    public string Code { get; set; }
    public string Product_Name { get; set; }
    public string DistributionCenter_Name { get; set; }

    internal static SKU ParseRow(string row)
    {
        var columns = row.Split(';');
        return new SKU()
        {
            SKU_ID = columns[0],
            SKU_Name = columns[1],
            Code = columns[2],
            Product_Name = columns[3],
            DistributionCenter_Name = columns[4],
        };
    }
}

在脚本中,我像在 csv 文件和我的数据库中一样命名了每一列。

我的主要内容如下

class Programm
{
      static void Main(string[] args)
      {
          var sku_info = ProcessCSV("skutest1.csv");                
          SqlConnection conn = new SqlConnection();    
          conn.ConnectionString = @"...";
          foreach (var information in sku_info)
          {    
              using SqlConnection connection = new SqlConnection(conn.ConnectionString);

              string commandString = ("INSERT INTO SKU VALUES ('" + information.SKU_ID + " "+information.SKU_Name+" "+information.Code+" "+information.Product_Name+" "+information.DistributionCenter_Name+"')");

              conn.Open();
              SqlTransaction transaction = conn.BeginTransaction();    
              SqlCommand cmd = new SqlCommand(commandString, conn, transaction);
              cmd.ExecuteNonQuery();   
              transaction.Commit();
          }

          Console.ReadKey();
      }

      private static List<SKU> ProcessCSV(string path)
      {
          return File.ReadAllLines("C:/.../skutest1.csv").Where(row => row.Length > 0).Select(SKU.ParseRow).ToList();
      }
}

Here's 关于构建参数化 commandstring 的简短教程 - 这是一种更安全的插入数据库的方法。

这是一个如何参数化插入的示例:

string commandString = (@"INSERT INTO SKU VALUES (@sku_id, @sku_name, @code, @product_name, @distributioncenter_name");

conn.Open();
SqlTransaction transaction = conn.BeginTransaction();

SqlCommand cmd = new SqlCommand(commandString, conn, transaction);

cmd.Parameters.Add(new SqlParameter("@sku_id", information.SKU_ID));
cmd.Parameters.Add(new SqlParameter("@sku_name", information.SKU_Name));
cmd.Parameters.Add(new SqlParameter("@code", information.Code));
cmd.Parameters.Add(new SqlParameter("@product_name", information.Product_Name));
cmd.Parameters.Add(new SqlParameter("@distributioncenter_name", information.DistributionCenter_Name));

cmd.ExecuteNonQuery();

transaction.Commit();

在服务器上加载文件的最快方法是使用 BULK INSERT,例如:

BULK INSERT someTable
FROM 'pathtofile`
WITH ( FORMAT = 'CSV' )

您可以为此使用 ADO.NET 的 SqlBulkCopy class to execute a BULK INSERT operation with data sent from the client. SqlBulkCopy expects either a DataTable or IDbDataReader parameter. You can use CsvHelper' CsvDataReader 来做类似的事情。 CsvDataReader 解析 CSV 文件并生成 SqlBulkCopy 所需的 IDbDataReader 接口。

代码可以这么简单:

using var txtReader = File.OpenText(pathToCSV);

var reader = new CsvReader(txtReader,CultureInfo.InvariantCulture);
using var dbReader = new CsvDataReader(reader);

var bcp = new SqlBulkCopy(cns);
bcp.ColumnMappings.Add("sku_id","sku_id");
bcp.ColumnMappings.Add("sku_name","sku_name");
...

bcp.DestinationTableName = table;
bcp.WriteToServer(dbReader);

如果没有映射,SqlBulkCopy 将按照它们在文件中出现的顺序发送列。如果这与 table 列的顺序不匹配,您将收到错误或更糟的是,混淆数据