如何使用 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
可能不存在,或者可能会抛出 NotSupportedException
。 Sylvan.Data
v0.2.0 库可以用来解决这个问题。您可以调用较旧的 GetSchemaTable
API,然后使用 Sylvan.Data.Schema
类型将其转换为 new-style 架构 IReadOnlyCollection<DbColumn>
:
DataTable schemaDT = reader.GetSchemaTable();
var tableSchema = Schema.FromSchemaTable(schemaDT);
我正在尝试将数据从 .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
可能不存在,或者可能会抛出 NotSupportedException
。 Sylvan.Data
v0.2.0 库可以用来解决这个问题。您可以调用较旧的 GetSchemaTable
API,然后使用 Sylvan.Data.Schema
类型将其转换为 new-style 架构 IReadOnlyCollection<DbColumn>
:
DataTable schemaDT = reader.GetSchemaTable();
var tableSchema = Schema.FromSchemaTable(schemaDT);