如何使用 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 的绝对最快的方法。