如何使用 C# 将 csv 文件中的数据导入 SQL 服务器数据库

How to import Data in csv file into a SQL Server database using C#

我正在尝试将数据从 .csv 文件导入 SQL 服务器数据库。我只有一个问题:对于货币行,由于货币变量格式错误,我抛出了 Format.Exception

我尝试转换为双精度我更改了句点而不是逗号,我在 split(); 方法中也更改了分号 ; 而不是逗号 , 但异常没有出现离开。有人知道该怎么办吗?

这只是一个实验。

我的 .csv 文件如下所示:

数据库 table 的列是:

name, second_Name, nickname, money

代码:

public void Import()
{
    SqlCommand command = null;
    var lineNumber = 0;

    using (SqlConnection conn = DatabaseSingleton.GetInstance())
    {
        // conn.Open();
        using (StreamReader reader = new StreamReader(@"C:\Users\petrb\Downloads\E-Shop\E-Shop\dataImport.csv"))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();

                if (lineNumber != 0)
                {
                    var values = line.Split(',');

                    using (command = new SqlCommand("INSERT INTO User_Shop VALUES (@name, @second_Name, @nickname, @money", conn))
                    {
                        command.Parameters.Add(new SqlParameter("@name", values[0].ToString()));
                        command.Parameters.Add(new SqlParameter("@second_Name", values[1].ToString()));
                        command.Parameters.Add(new SqlParameter("@nickname", values[2].ToString()));
                        command.Parameters.Add(new SqlParameter("@money", Convert.ToDecimal(values[3].ToString())));
                        command.Connection = conn;

                        command.ExecuteNonQuery();
                    }
                }

                lineNumber++;
            }
        }

        conn.Close();
    }

    Console.WriteLine("Products import completed");
    Console.ReadLine();
}

试试这个:

SqlParameter moneyParam = new SqlParameter("@money", SqlDbType.Money);
moneyParam.Value = SqlMoney(Convert.ToDecimal(values[3].ToString()))
command.Parameters.Add(moneyParam)

不确定它是否有效,但对我来说似乎很有意义。

问题是,当您为 SQL 参数使用构造函数时,我认为它假定您的变量类型,因此在这种情况下,当您传递一个双精度或其他任何东西时,等效数据库类型是 'decimal',但是您的数据库模式将使用数据库类型 'money',因此在您的参数构造函数中显式设置数据库类型应该有所帮助。

我维护了一个包 Sylvan.Data.Csv,可以很容易地将 CSV 数据批量导入 SQL 服务器,假设您的 CSV 文件的形状与目标 table 匹配。

下面是一些演示如何操作的代码:

SqlConnection conn = ...;

// Get the schema for the target table
var cmd = conn.CreateCommand();
cmd.CommandText = "select top 0 * from User_Shop";
var reader = cmd.ExecuteReader();
var tableSchema = reader.GetColumnSchema();

// apply the schema of the target SQL table to the CSV data.
var options = 
    new CsvDataReaderOptions { 
        Schema = new CsvSchema(tableSchema)
    };

using var csv = CsvDataReader.Create("dataImport.csv", options);

// use sql bulk copy to bulk insert the data
var bcp = new SqlBulkCopy(conn);
bcp.BulkCopyTimeout = 0;
bcp.DestinationTableName = "User_Shop";
bcp.WriteToServer(csv);

在某些 .NET Framework 版本上 GetColumnSchema 可能不存在,或者可能会抛出 NotSupportedExceptionSylvan.Data v0.2.0 库可以用来解决这个问题。您可以调用较旧的 GetSchemaTable API,然后使用 Sylvan.Data.Schema 类型将其转换为 new-style 架构 IReadOnlyCollection<DbColumn>:

DataTable schemaDT = reader.GetSchemaTable();
var tableSchema = Schema.FromSchemaTable(schemaDT);