.csv
我正在嘗試將資料從檔案匯入 SQL Server 資料庫。Format.Exception
我只有一個問題:對于貨幣行,由于貨幣變數的格式錯誤,我正在拋出。
我嘗試轉換為雙精度,我更改了句點而不是逗號,我在split();
方法中也更改了分號;
而不是逗號,
,但例外并沒有消失。有誰知道該怎么做?
這只是一個實驗。
我的 .csv 檔案如下所示:
資料庫表的列是:
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();
}
uj5u.com熱心網友回復:
我維護了一個包Sylvan.Data.Csv,它可以很容易地將 CSV 資料批量匯入 SQL Server,假設 CSV 檔案的形狀與目標表匹配。
這是一些演示如何執行此操作的代碼:
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 框架版本上GetColumnSchema
可能不存在,或者可能拋出NotSupportedException
. v0.2.0庫可用于解決此問題Sylvan.Data
。您可以呼叫較舊的GetSchemaTable
API,然后使用Sylvan.Data.Schema
型別將其轉換為新樣式的架構IReadOnlyCollection<DbColumn>
:
DataTable schemaDT = reader.GetSchemaTable();
var tableSchema = Schema.FromSchemaTable(schemaDT);
uj5u.com熱心網友回復:
嘗試這個:
SqlParameter moneyParam = new SqlParameter("@money", SqlDbType.Money);
moneyParam.Value = SqlMoney(Convert.ToDecimal(values[3].ToString()))
command.Parameters.Add(moneyParam)
不確定它是否會起作用,但對我來說似乎很有意義。
問題是當您使用 SQL 引數的建構式時,我認為它假定您的變數的型別,所以在這種情況下,當您傳遞雙精度或其他值時,等效的 DB 型別是“十進制”,但是您的資料庫模式將使用資料庫型別“金錢”,因此在引數建構式中明確設定資料庫型別應該會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/441869.html