gpt4 book ai didi

.net - 如何将 CsvHelper 记录添加到 DataTable 以用于 SqlBulkCopy 到数据库

转载 作者:行者123 更新时间:2023-12-03 07:02:58 54 4
gpt4 key购买 nike

我正在尝试使用 CsvHelper 读取 CSV 文件,将每条记录加载到 DataTable 中,然后使用 SqlBulkCopy 将数据插入数据库表中。使用当前代码,在向数据表添加行时出现异常。异常(exception)情况是:“无法将‘MvcStockAnalysis.Models.StockPrice’类型的对象转换为‘System.IConvertible’类型。无法存储在日期列中。预期类型为 DateTime。”

示例 CSV 文件来自雅虎财经。例如:http://ichart.yahoo.com/table.csv?s=MMM&a=0&b=1&c=2010&d=0&e=17&f=2014&g=d&ignore=.csv

CSV 文件包含以下 header : 日期 开盘价 最高价 最低价 收盘量 调整收盘价

我正在将 CSV 文件读入的模型:

namespace MvcStockAnalysis.Models
{
using System;
using System.Collections.Generic;

public partial class StockPrice
{
public int Id { get; set; }
public System.DateTime Date { get; set; }
public int CompanyId { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; }
public double AdjClose { get; set; }
public double Open { get; set; }
public double Volume { get; set; }

public virtual Company Company { get; set; }
}
}

CSV 文件到 StockPrice 类的映射使用以下内容:

public class StockPriceClassMap : CsvClassMap<StockPrice>
{
public override void CreateMap()
{
Map(m => m.Date).Name("Date");
Map(m => m.Close).Name("Close");
Map(m => m.AdjClose).Name("Adj Close");
Map(m => m.High).Name("High");
Map(m => m.Low).Name("Low");
Map(m => m.Open).Name("Open");
Map(m => m.Volume).Name("Volume");
}
}

尝试将 CsvHelper 记录添加到 DataTable 的代码如下:

var connectionstring = ConfigurationManager.ConnectionStrings["MvcStockAnalysis.Models.MvcStockAnalysisContext"];
var connection = new SqlConnection();
connection.ConnectionString = connectionstring.ToString();
var destinationTableName = "StockPrices";
var company = db.Company
.Where(c => c.Symbol == "MMM")
.FirstOrDefault();

try
{
string path = HttpContext.Server.MapPath("~/App_Data/" + company.Symbol + @".csv");

if (System.IO.File.Exists(path))
{

using (StreamReader sr = new StreamReader(path))
{
using (var csv = new CsvReader(sr))
{
DataTable dt = new DataTable("StockPrices");
csv.Configuration.HasHeaderRecord = true;
csv.Configuration.RegisterClassMap<StockPriceClassMap>();

dt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
dt.Columns.Add(new DataColumn("Close", typeof(Double)));
dt.Columns.Add(new DataColumn("AdjClose", typeof(Double)));
dt.Columns.Add(new DataColumn("High", typeof(Double)));
dt.Columns.Add(new DataColumn("Low", typeof(Double)));
dt.Columns.Add(new DataColumn("Open", typeof(Double)));
dt.Columns.Add(new DataColumn("Volume", typeof(Double)));
dt.Columns.Add(new DataColumn("CompanyId", typeof(Double)));
var records = csv.GetRecords<StockPrice>().ToList();
foreach (var record in records)
{
record.CompanyId = company.Id;
dt.Rows.Add(record);
}
// add dt to the database
using (var bulkCopy = new SqlBulkCopy(connection.ConnectionString))
{
// DataTable column names match my SQL Column names, so I simply made this loop.
foreach (DataColumn col in dt.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.WriteToServer(dt);
}
}
}
}
connection.Close();
}
catch (Exception e)
{
Console.Write(e.Message);
}

如何将 CsvHelper 记录添加到 DataTable 以用于 SqlBulkCopy 到数据库?

最佳答案

如果我没记错的话,你应该能够用更少的代码来完成它。在进入 DataTable 之前,您也不必将其放入另一个类中。

while( csv.Read() )
{
var row = dt.NewRow();
foreach( DataColumn column in dt.Columns )
{
row[column.ColumnName] = csv.GetField( column.DataType, column.ColumnName );
}
dt.Rows.Add( row );
}

关于.net - 如何将 CsvHelper 记录添加到 DataTable 以用于 SqlBulkCopy 到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257827/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com