【问题标题】:Data Type Issues数据类型问题
【发布时间】:2021-04-24 01:32:15
【问题描述】:

我在使用 C#StreamReader 从 csv 文件导入数据并将其存储在 SQL Server 中时遇到问题。 csv 文件中的所有列在插入数据库表时都被读取为varchar 数据类型。如何以正确的方式插入,以便将具有数值的列存储为int/float,将字符串存储为varchar等。

谁能建议一个正确的方法来完成这项任务?

任何人都可以提供健壮且通用的代码吗?

提前致谢。

【问题讨论】:

  • 我不明白,表格是自动生成的?如果不是,为什么不手动放置好类型?
  • 您需要转换您的数据类型。如果你分享你的代码的一部分,我可以告诉你如何修改它来实现它。
  • 使用 CsvHelper 读取文件,您将有一个类来表示具有正确数据类型的数据。这是一个非常可靠的包。
  • 你是如何插入的? SqlCommand 还是 SqlBulkCopy?还是别的什么?

标签: c# asp.net sql-server csv sqldatatypes


【解决方案1】:

我维护了一个可以轻松处理此问题的库:Sylvan.Data.Csv。关键是你需要为传入的数据提供一个模式,以便SqlClient库知道如何处理它。

// the "Schema" type comes from Sylvan.Data package
var schema =
    new Schema
    .Builder()
    .Add<int>("Id")
    .Add<string>("Name")
    .Add<DateTime?>("ModifiedDate")
    .Build();


var opts = new CsvDataReaderOptions
{
    Schema = new CsvSchema(schema)
};

// Create, or CreateAsync can be passed the name of a file or a TextReader.
using var csv = CsvDataReader.Create(csvFilefame, opts);

SqlConnection conn = ...;

var bcp = new SqlBulkCopy(conn);
bcp.BulkCopyTimeout = 0; // no timeout.
bcp.DestinationTableName = "MyTable";
bcp.BatchSize = 50000;
bcp.WriteToServer(csv);

Schema 类型是在 Sylvan.Data 包中定义的,该包目前仅是预发布版本,因此如果您不喜欢依赖它(可以理解),您可以实现自己的 ICsvSchemaProvider,即满容易。这个answer 有一个实现您自己的类型化模式提供程序的示例。

如果您有任何疑问或问题,请随时通过https://github.com/MarkPflug/Sylvan 提出问题

【讨论】:

    【解决方案2】:

    我过去所做的是将加载到临时表中,并将所有列作为基于字符的列,并允许/预期最大长度。然后,在所有输入列之后,我会将这些列添加为它们的最终数据格式,这样它们就不会对导入流/逗号/制表符分隔格式产生任何影响。

    将数据导入临时表后,运行更新查询以获取 int、decimal、float、bit、日期/时间等的最终格式。

    最后,如果一切顺利,那么您可以根据需要执行所有查询或从临时文件中的选择中插入以进行最终导入。

    例如:

    临时表有

    FirstName  varchar(20),
    LastName   varchar(20),
    BirthDateText varchar(10),
    SalaryText varchar(10),
    AnyOtherColumns varchar(10),
    RealBirthDate Timestamp
    Salary  decimal
    

    因此,导入从FirstName 填充到AnyOtherColumns,但现在您可以运行更新命令以正确转换为相应的REALBirthDateSalary 数据列。

    没有第三方,完全在您的控制之下,数据清理也可以在进入最终目的地之前完成/验证。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2018-10-27
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2014-10-13
      相关资源
      最近更新 更多