一尘不染

使用VB.Net将CSV文件导入到Access数据库

sql

我正在使用以下代码将CSV文件导入到Access DB。我只是有几个问题。

    Con.Open()
    Dim strSqlCommand = "SELECT F1 AS id, F2 AS firstname " &
                        "INTO MyNewTable " &
                        "FROM [Text;FMT=Delimited;HDR=No;CharacterSet=850;DATABASE=" & GlobalVariables.strDefaultDownloadPath & "].Airports.csv;"
    Dim sqlCommand = New System.Data.OleDb.OleDbCommand(strSqlCommand, Con)
    sqlCommand.ExecuteNonQuery()
    Con.Close()

如何将字符集更改为UTF-8?如果输入utf8而不是850,则会出现错误。

另外,我的CSV文件的第一行包含列名称。我可以修改上面的代码以考虑到这一点吗?

问候,

安德鲁


阅读 243

收藏
2021-03-17

共1个答案

一尘不染

您可能会遇到尝试一次导入并全部选择所有对象的麻烦,因为一件事,您可能不希望将数据类型转换为Access。为此,您将需要2个连接和SQL字符串以从彼此选择以插入到另一个。

连接字符串将需要如下所示:

 "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Temp\Tmp;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;CharacterSet=ANSI'"

请注意,仅列出了路径,并且将Extended Properties其括在刻度中。如果第一行包含标题/字段名,则将HDR=Yes在结果集中跳过它们。将字段名称用作第一行的好处之一是OleDB会将它们用作列名称(不需要F1 As foo, F2 As bar;实际上,由于将它们从F1,F2重命名而将失败)。

从CSV读取的SQL:

 "SELECT * FROM filename.csv"

有几种处理方法。您可以使用阅读器一次读取一行,以将它们插入Access数据库。这可能更简单:将CSV中的所有数据都放入一个DataTable中,然后将其插入到Access中:

Private myDT As DataTable    ' form level variable

...
Dim csvStr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Temp\Tmp;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;CharacterSet=ANSI'"
Dim csvSQL = "SELECT * FROM Capitals.csv"    ' use YOUR file name

Using csvCn = New OleDbConnection(csvStr),
         cmd As New OleDbCommand(csvSQL, csvCn)

    Using da As New OleDbDataAdapter(cmd)
        myDT = New DataTable
        da.Fill(myDT)
    End Using
End Using

For Each r As DataRow In myDT.Rows
    'ToDo: INSERT INTO Access
Next

Connection,Command和DataAdapter都是资源,因此在使用它们时,它们位于USING块中以进行处理。myDT将具有的集合Rows,每个集合都Items表示CSV中的字段。只需循环遍历将所需项添加到Access
DB的行。

您很可能必须将相同的数据类型从String转换为Integer或DateTime等。

至于有关UTF8的问题,您可以使用Codepage标识符。如果将其保留为连接字符串,它将使用注册表中可能有效的任何内容。对于UTF8使用CharacterSet=65001

2021-03-17