【问题标题】:SqlBulkCopy From CSV to SQL DatatableSqlBulkCopy 从 CSV 到 SQL 数据表
【发布时间】:2010-05-24 18:03:33
【问题描述】:

我正在使用 SQL Server 2005、VB.NET 2005。我希望能够将一个非常大的 excel 文件导入一个名为“XYZ”的 SQL 表中

我通过以下方式做到了这一点:
1. 将 excel 文件另存为 csv。(使用 SaveAs XLCSV 选项)
2. 从 CSV 构建数据表“ABC”。(使用 ODBC 连接并从 '*'.csv 命令中选择 *)
3. 将数据表“ABC”复制到数据库表“xyz”中(使用sqlBulkCopy.WriteToServer())

它工作正常,没有任何错误,但是当我检查我的数据库时,我发现某些列的数据类型已更改,因此它没有复制一些记录。任何帮助将不胜感激

【问题讨论】:

  • 您是否尝试过使用 Excel ODBC 驱动程序并直接从 excel 中读取?这应该避免列类型的任何问题。默认情况下,CSV 文件是无类型的,除非您有伴随它们的 schema.ini。

标签: .net vb.net sql-server-2005


【解决方案1】:

我认为您最好在 SQL Server 中创建目标表并使用 T-SQL BULK INSERT 插入 CSV。然后,数据类型在您的表中是显式的。使用中间数据库存在推断错误数据类型以及冗余复制数据的风险。

【讨论】:

  • 我没有使用中间数据库,它只是使用 odbc dataadapter 从 csv 填充的数据集。我的目标表仅在 Sql Server 中。
  • 抱歉 - 我将“数据表”误读为“数据库”。现在有道理了!在您的 SELECT * FROM ABC 中,尝试显式选择列并使用 (CAST AS type) 显式命名要使用的类型。
  • 能不能帮我写这样的sql语句,谢谢。
  • 创建一个 schema.ini 文件并将其放在与 CSV 相同的文件夹中可能是最简单的。见msdn.microsoft.com/en-us/library/ms709353%28VS.85%29.aspx
  • 非常感谢,这有帮助。尽管我还有一个问题,我怎样才能利用同一目录中多个 csv 文件的架构文件。是否可以在同一个 Schema 文件中写入多个 csv 文件的列名和格式??
【解决方案2】:

schema.ini 可以定义多个 csv 文件,如下所示:

[customer.csv]
Format=CSVDelimited
CharacterSet=ANSI
ColNameHeader=True
Col1=customerID Long
Col2=customerName Text Width 128
Col3=comments Memo

[order.csv]
Format=CSVDelimited
CharacterSet=ANSI
ColNameHeader=True
Col1=orderID Long
Col2=customerID Long
Col3=orderDate DateTime

[orderDetail.csv]
Format=CSVDelimited
CharacterSet=ANSI
ColNameHeader=True
Col1=orderID Long
Col2=itemID Long
Col3=Quantity Short

有关 schema.ini 和支持的数据类型的更多信息,请访问 http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 2023-01-24
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多