将列表中的值插入数据库
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 列的顺序不匹配,您将收到错误或更糟的是,混淆数据
我想解析一个 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 列的顺序不匹配,您将收到错误或更糟的是,混淆数据