3

我有一个包含 300 多个 Access 数据库的文件夹(由我无法控制的程序编写)。它们都具有相同的结构,只是一个表。我正在将数据导入 SQL Server (2005) 中的表中。使用导入向导效果很好,但一次只能使用一个 Access db。

我已经搜索并搜索了一种方法来做到这一点,我认为我正在使用 ForEach 循环容器中的数据流任务。但是,我只看到了一种使用 Excel 文件或平面文件作为源的方法。

任何帮助是极大的赞赏。

4

2 回答 2

1

对于一次性任务,您可以使用一次性 VBA 代码。

创建一个新数据库,并在该数据库中创建一个指向您的 SQL Server 表的 ODBC 链接。

然后创建一个与此类似的新 Access 查询:

INSERT INTO remote_table (<field list>)
SELECT <field list>
FROM YourTable In 'C:\SourceFolder\db1.mdb';

如果源和目标中的字段名称相同,则可以省略<field list>.

INSERT INTO remote_table
SELECT *
FROM YourTable In 'C:\SourceFolder\db1.mdb';

在最好的情况下,Access 字段值将与 SQL Server 字段类型兼容。如果不是,则必须使用 Access 函数将字段值转换为 SQL Server 兼容类型。

完成排序后,从 Access db 文件上传数据的 VBA 过程可能会变得快速而简单:

Sub Test()
Const cstrExtension As String = "mdb"
Const cstrFolder As String = "C:\SourceFolder\"
Dim db As DAO.database
Dim strDbFile As String
Dim strInsert As String

strInsert = "INSERT INTO remote_table (<field list>)" & vbCrLf & _
    "SELECT <field list>" & vbCrLf & _
    "FROM YourTable In 'DB_FILE';"
Set db = CurrentDb
strDbFile = Dir(cstrFolder & "*." & cstrExtension)
Do While Len(strDbFile) > 0
    db.Execute Replace(strInsert, DB_FILE, _
        cstrFolder & strDbFile), dbFailOnError
    strDbFile = Dir()
Loop
Set db = Nothing
End Sub
于 2013-01-21T18:36:26.173 回答
1

你需要做的是:

1.- 在你的包中创建 2 个变量,一个名为“current_file”,另一个名为“loading_location”(或您喜欢的名称),两者都具有包的范围,数据类型字符串,对于 current_file,保持值为空,放在 loading_location 上带有 Access 数据库的文件夹的路径。

2.- 添加一个 Foreach 循环容器,在里面去 Collection,选择 Expressions,然后添加一个新的 Expression。在属性上选择目录,然后在表达式中选择刚刚创建的 loading_location 变量。再次返回集合并在文件中输入:*.mdb

保持所有其他选项相同。然后转到变量映射并在变量中选择 current_file 变量。

3.- 创建一个新的 OLE DB 连接。在提供程序上选择“Microsoft Jet 4.0 OLE DB 提供程序”,在数据库文件名上选择您的任何访问数据库(稍后会更改,不要担心)。

4.- 在 Foreach 循环容器内创建一个数据流任务,在该数据流任务内添加一个 OLE DB 源。打开 OLE DB 源,在连接管理器中,选择刚刚创建的连接,在数据访问模式下选择“表或视图”,然后选择数据库的表。

5.- 添加一个 OLE DB 目标,为目标数据库选择相应的连接,然后选择要放置 Access 数据库数据的表。

现在我们将对此进行更改以通过每个 Access 数据库..

6.- 选择您为 Access DB 创建的连接,转到“属性”窗口并记下 ConnectionString 值,在我的例子中是:

数据源="MyAccessDBFile";Provider=Microsoft.Jet.OLEDB.4.0;

根据对数据库的权限,您可能有其他东西。现在转到 Expression 属性,展开它,我们将添加 2 个表达式。一个超过属性“ConnectionString”,并在表达式中放置

"数据源="+yourCurrentFileVariable+";Provider=Microsoft.Jet.OLEDB.4.0;"

你应该得到这样的东西:

"数据源="+ @[User::current_file]+";Provider=Microsoft.Jet.OLEDB.4.0;"

为属性“ServerName”添加一个新表达式,在这个表达式中选择 current_file 变量作为表达式,你应该在表达式字段中得到如下内容:

@[用户::current_file]

图片

7.- 现在你会在 OLE DB 源中得到一个错误,不要担心这只是因为 current_file 变量还没有任何值。返回到 Foreach 循环容器中的数据流任务,并将 DelayValidation 属性设置为 true。转到项目->“您的包”属性->调试,并将 Run64BitRunteime 设置为 false。

图片

就是这样。

于 2014-01-02T14:44:50.433 回答