使用C#.net sql-database存储.csv文件中本地收集的信息的最佳方法是什么?我的理由是 1:我要处理的数据很大(每个csv中有数百万行)。 2:数据非常精确,因为它描述了纳米尺度上的测量结果,因此非常精细。
我的第一个问题是将csv的每一行存储在数据库中的对应行中。我是使用DataTable.cs-class完成的。完成后,我觉得如果在解析.csv文件时出现问题,我就不会注意到了。
我的第二个问题是将.csvfiles上传到.csv格式的数据库中,然后在用户请求时将文件从数据库解析到本地环境。如果甚至可以在c#.net中使用visual stuido 2013,那怎样才能以高效安全的方式完成呢?
答案 0 :(得分:1)
我在项目中使用了来自csv reader的.Net DataStreams库。它使用SqlBulkCopy类,但它不是免费的。
示例:
using (CsvDataReader csvData = new CsvDataReader(path, ',', Encoding.UTF8))
{
// will read in first record as a header row and
// name columns based on the values in the header row
csvData.Settings.HasHeaders = true;
csvData.Columns.Add("nvarchar");
csvData.Columns.Add("float"); // etc.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "DestinationTable";
bulkCopy.BulkCopyTimeout = 3600;
// Optionally, you can declare columnmappings using the bulkCopy.ColumnMappings property
bulkCopy.WriteToServer(csvData);
}
}
答案 1 :(得分:1)
听起来您只是在询问是否应该在数据库中存储源CSV的副本,因此如果出现导入错误,您可以查看事后发生的事情。
在我看来,这可能不是一个好主意。它立即让我问,你怎么知道发生了错误?您当然不应该依赖人类注意到错误,因此您必须开发一种以编程方式检查错误的方法。如果您有自动错误检查方法,则应在导入时应用该方法,并首先避免错误。你在这里看到循环逻辑吗?
也许我错过了一些东西,但我没有看到存储CSV的好处。
答案 2 :(得分:0)
您应该使用Bulk Insert。将您的csv文件作为源。 但这只有在可以从运行SQL Server的PC访问该文件时才有效。
Here你也可以找到一个很好的解决方案。简而言之,它看起来像这样:
StreamReader file = new StreamReader(bulk_data_filename);
CsvReader csv = new CsvReader(file, true,',');
SqlBulkCopy copy = new SqlBulkCopy(conn);
copy.DestinationTableName = tablename;
copy.WriteToServer(csv);