我有一个包含 300 多个 Access 数据库的文件夹(由我无法控制的程序编写)。它们都具有相同的结构,只是一个表。我正在将数据导入 SQL Server (2005) 中的表中。使用导入向导效果很好,但一次只能使用一个 Access db。
我已经搜索并搜索了一种方法来做到这一点,我认为我正在使用 ForEach 循环容器中的数据流任务。但是,我只看到了一种使用 Excel 文件或平面文件作为源的方法。
任何帮助是极大的赞赏。
我有一个包含 300 多个 Access 数据库的文件夹(由我无法控制的程序编写)。它们都具有相同的结构,只是一个表。我正在将数据导入 SQL Server (2005) 中的表中。使用导入向导效果很好,但一次只能使用一个 Access db。
我已经搜索并搜索了一种方法来做到这一点,我认为我正在使用 ForEach 循环容器中的数据流任务。但是,我只看到了一种使用 Excel 文件或平面文件作为源的方法。
任何帮助是极大的赞赏。
对于一次性任务,您可以使用一次性 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
你需要做的是:
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。
就是这样。