如何使用 C# 将值从 csv 导入到 SqlServer
How to import values from csv to SqlServer using c#
我遇到过这个 problem.I 我正在尝试从 csv 将数据导入数据库 file.Normally 插入部分有效,但现在我保留出现错误:
将int转换为数据类型numeric的算术溢出错误
。
声明一直是 terminated.It 可能是因为我将 id 作为第一个 属性,但是如果我通过省略 id 来“移动”数组,我会再次收到错误,但不同的是:,“索引超出数组范围。"
学生 class 是简单的 id,firstName,lastName,salary
来自 csv 文件的值:
public void Import()
{
var lineNumber = 0; //method for connection
using (SqlConnection conn = DatabaseSingleton.GetInstance())
{
//conn.Open(); //In my project there is my string path to csv file
using (StreamReader reader = new StreamReader(myStringPath))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (lineNumber != 0)
{
var values = line.Split(',');
using (command = new SqlCommand("INSERT INTO uzivatel_Barabas VALUES (@id ,@first_Name, @last_Name,@salary) ", conn)) {
command.Parameters.Add(new SqlParameter("@id", Convert.ToInt32(values[0].ToString())));
command.Parameters.Add(new SqlParameter("@first_Name", values[1].ToString()));
command.Parameters.Add(new SqlParameter("@last_Name",values[2].ToString()));
command.Parameters.Add(new SqlParameter("@salary", Convert.ToDouble(values[3].ToString())));
//var sql = "INSERT INTO uzivatel_Barabas VALUES (@first_Name,@last_Name,@salary)";
command.Connection = conn;
command.ExecuteNonQuery();
}
lineNumber++;
}
}
conn.Close();
}
Console.WriteLine("Products Import Complete");
Console.ReadLine();
}
我认为,问题出在这个字符串中 -> "var values = line.Split(',');"
在这个字符串之后,你的值将是字符串类型,所以当你试图将它存储到数据库时,你会得到错误的 int 到字符串。
'...'- 字符串类型
尝试写没有''的数字值
如评论中所述,您应该使用一个库来解析您的 CSV。 String.Split
不处理 CSV 文件中可能存在的边缘情况:例如带分隔符和换行符的引号字段。
我维护着一个库 Sylvan.Data.Csv,这使得将 CSV 数据批量加载到 SQL 数据库变得非常容易。关键是它允许在循环中使用 SqlBulkCopy
而不是使用插入 SqlCommand
,这最终会快很多。 SqlBulkCopy 要求传入的列类型与目标的类型相匹配 table。我的库允许将架构应用于 CSV 数据以启用此方案。
假设您的 CSV 文件的列直接映射到目标 SQL table 它可以用很少的代码行完成。
using SqlConnection conn = ...;
// Read the schema for the target table
using var cmd = conn.CreateCommand();
cmd.CommandText = "select top 0 * from uzivatel_Barabas";
using var reader = cmd.ExecuteReader();
var tableSchema = reader.GetColumnSchema();
// apply the schema of the target SQL table to the CSV data reader
// this is require for the SqlBulkCopy to process the data as the
// correct type without manual conversions.
var options =
new CsvDataReaderOptions {
Schema = new CsvSchema(tableSchema)
};
using var csv = CsvDataReader.Create("uzivatel_Barabas.csv", options);
using var bcp = new SqlBulkCopy(conn);
bcp.DestinationTableName = "uzivatel_Barabas";
bcp.WriteToServer(csv);
Sylvan.Data.Csv 也是 .NET 的 fastest CSV parser,因此这应该是将数据导入 SqlServer 的绝对最快的方法。
我遇到过这个 problem.I 我正在尝试从 csv 将数据导入数据库 file.Normally 插入部分有效,但现在我保留出现错误:
将int转换为数据类型numeric的算术溢出错误
。 声明一直是 terminated.It 可能是因为我将 id 作为第一个 属性,但是如果我通过省略 id 来“移动”数组,我会再次收到错误,但不同的是:,“索引超出数组范围。"
学生 class 是简单的 id,firstName,lastName,salary
来自 csv 文件的值:
public void Import()
{
var lineNumber = 0; //method for connection
using (SqlConnection conn = DatabaseSingleton.GetInstance())
{
//conn.Open(); //In my project there is my string path to csv file
using (StreamReader reader = new StreamReader(myStringPath))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (lineNumber != 0)
{
var values = line.Split(',');
using (command = new SqlCommand("INSERT INTO uzivatel_Barabas VALUES (@id ,@first_Name, @last_Name,@salary) ", conn)) {
command.Parameters.Add(new SqlParameter("@id", Convert.ToInt32(values[0].ToString())));
command.Parameters.Add(new SqlParameter("@first_Name", values[1].ToString()));
command.Parameters.Add(new SqlParameter("@last_Name",values[2].ToString()));
command.Parameters.Add(new SqlParameter("@salary", Convert.ToDouble(values[3].ToString())));
//var sql = "INSERT INTO uzivatel_Barabas VALUES (@first_Name,@last_Name,@salary)";
command.Connection = conn;
command.ExecuteNonQuery();
}
lineNumber++;
}
}
conn.Close();
}
Console.WriteLine("Products Import Complete");
Console.ReadLine();
}
我认为,问题出在这个字符串中 -> "var values = line.Split(',');" 在这个字符串之后,你的值将是字符串类型,所以当你试图将它存储到数据库时,你会得到错误的 int 到字符串。 '...'- 字符串类型 尝试写没有''的数字值
如评论中所述,您应该使用一个库来解析您的 CSV。 String.Split
不处理 CSV 文件中可能存在的边缘情况:例如带分隔符和换行符的引号字段。
我维护着一个库 Sylvan.Data.Csv,这使得将 CSV 数据批量加载到 SQL 数据库变得非常容易。关键是它允许在循环中使用 SqlBulkCopy
而不是使用插入 SqlCommand
,这最终会快很多。 SqlBulkCopy 要求传入的列类型与目标的类型相匹配 table。我的库允许将架构应用于 CSV 数据以启用此方案。
假设您的 CSV 文件的列直接映射到目标 SQL table 它可以用很少的代码行完成。
using SqlConnection conn = ...;
// Read the schema for the target table
using var cmd = conn.CreateCommand();
cmd.CommandText = "select top 0 * from uzivatel_Barabas";
using var reader = cmd.ExecuteReader();
var tableSchema = reader.GetColumnSchema();
// apply the schema of the target SQL table to the CSV data reader
// this is require for the SqlBulkCopy to process the data as the
// correct type without manual conversions.
var options =
new CsvDataReaderOptions {
Schema = new CsvSchema(tableSchema)
};
using var csv = CsvDataReader.Create("uzivatel_Barabas.csv", options);
using var bcp = new SqlBulkCopy(conn);
bcp.DestinationTableName = "uzivatel_Barabas";
bcp.WriteToServer(csv);
Sylvan.Data.Csv 也是 .NET 的 fastest CSV parser,因此这应该是将数据导入 SqlServer 的绝对最快的方法。