【问题标题】:Specify target columns on import (CSV to Access)在导入时指定目标列(CSV 到 Access)
【发布时间】:2011-10-12 21:57:59
【问题描述】:

我发现了如何通过another question 将 CSV 导入我的 Access 数据库。但是在answer 中没有关于如何在导入时定位特定列的信息。如何确保将 CSV 中的正确列放入数据库中的正确列中?

我需要能够在使用经典 ASP 导入列值时对其进行编辑/添加。例子:

  • CSV 中的第 4 列是用户 ID,当它进入数据库的电子邮件列时,我需要能够在末尾添加“@domain.com”。
  • 第 6 列是一个分类:如果它的值为“教师”,那么在导入时,我需要将其更改为“课堂”。

我正在处理一些不是我创建的旧代码和数据库。相信我,如果可以的话,我会使用其他东西,所以请不要使用 MS Access。

我想这整件事可以归结为:


// 更新:

我已经按照我的想法设置了一切,但是我收到了一个错误:

ADODB.Recordset error '800a0bb9'

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

/datazone_bkup/Rollover/importTeachers.asp, line 12

第 12 行:CSV.open "SELECT * FROM teachers.csv", conn

我的完整代码如下:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
             Server.MapPath("\path\to\file") & ";Extended Properties='text;HDR=no;FMT=Delimited';"

Set connCSV = Server.CreateObject("ADODB.Connection")
connCSV.Open strConn

Set CSV = Server.CreateObject("ADODB.recordset")
    CSV.open "SELECT * FROM teachers.csv", conn

    do until CSV.eof
        UserName = CSV.Fields(4)
        LastName = CSV.Fields(1)
        FirstName = CSV.Fields(2)
        MiddleName = CSV.Fields(3)
        School = CSV.Fields(5)
        if CSV.Fields(6) = "Teacher" then
            SecLevel = "Classroom"
        end if
        Active = "Yes"
        TeacherNumber = rsCSV.Fields(0)
        rsCSV.movenext
        
        sql = "INSERT INTO tblTeacher (UserName, LastName, FirstName, MiddleName, School, SecLevel, Active, TeacherNumber) " &_
                "VALUES (" &_
                    "'" & UserName & "','" & LastName & "','" & FirstName & "','" & MiddleName & "'," &_
                    "'" & School & "','" & SecLevel & "','" & Active & "','" & TeacherNumber & "'" &_
                ")"

        on error resume next
        conn.execute(sql)
    loop

@HansUp,当我尝试在rsDB!UserName 中使用! 时,我收到了Syntax Error。所以我回到为 CSV 列值设置变量。

再次感谢您的帮助。

【问题讨论】:

  • 这很容易受到 sql 注入黑客攻击
  • @JoelCoehoorn,感谢您的关注;但是,这是在 Intranet 上,并且受密码保护。在这个网站上,SQL 注入的可能性几乎为零。

标签: database ms-access csv asp-classic


【解决方案1】:

与您链接的上一个问题一样,假设您打开了一个包含 CSV 内容的 ADO 记录集。您可以为 Access 目标表打开第二个 ADO 记录集。

如果 CSV 文件包含列名,您可以循环遍历其记录行并将其值插入到目标记录集中。如果 CSV 记录集是 rsCSV 并且目标表的记录集是 rsDB ...

Do While Not rsCSV.EOF
    rsDB.AddNew
    rsDB!userid = rsCSV!userid & "@domain.com"
    If rsCSV!classification = "Teacher" Then
        rsDB!classification = "Classroom"
    Else
        rsDB!classification = rsCSV!classification
    End If
    rsDB.Update
    rsCSV.MoveNext
Loop

如果 CSV 不包含列名,您仍然可以这样做,但需要使用字段集合中字段的序号位置。这些位置编号从零开始,因此第 4 列为 3,依此类推。

Do While Not rsCSV.EOF
    rsDB.AddNew
    rsDB!userid = rsCSV.Fields(3) & "@domain.com"
    If rsCSV.Fields(5) = "Teacher" Then
        rsDB!classification = "Classroom"
    Else
        rsDB!classification = rsCSV.Fields(5)
    End If
    rsDB.Update
    rsCSV.MoveNext
Loop

【讨论】:

  • 非常感谢非常。一个非常清晰和简洁的答案。另外,感谢您包含“无列名”代码,因为我正在使用的 csv 没有它们。我会告诉你结果如何。
猜你喜欢
  • 2017-07-23
  • 2015-08-12
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多