使用ADO / DAO连接从SQL Server下载数据

时间:2014-03-24 18:04:14

标签: sql sql-server vba ms-access

我试图找出如何使用Access VBA中的ADO / DAO连接下载以从SQL Server获取表的内容。我试图避免使用链接表因为数据库需要密码而且我一直遇到问题,因为它不需要登录信息。关于此事,我是否有任何想法或参考资料?

2 个答案:

答案 0 :(得分:2)

无论哪种方式,您都需要提供SQL凭据。

在没有链接表的情况下涉及更多,基本上你需要一个源记录集和“目标”表来迭代。

targetrs = CurrentDb.OpenRecordset("Target", dbOpenTable)

Dim Con As New ADODB.Connection
Dim sqlStr As String 
    Con.Open _
        "Provider = sqloledb;" & _
        "Data Source=SqlServer;" & _
        "Initial Catalog=MyDB;" & _
        "User ID=sa;" & _
        "Password=p@ssW0rd;"

Dim rsSource As New ADODB.Recordset 
    rsSource.Open "select * from SOURCE", Con

    do until rsSource.eof
        targetrs.addnew
        for each field in rsSource
            targetrs.fields(field.Name) = rsSource.fields(field.Name)
        next
        targetrs.update
        rssource.movenext
    loop

由于您仍需要凭据,因此可以动态链接表格:

docmd.TransferDatabase acLink,"ODBC Database",
"ODBC;Driver={SQL Server};Server=MySQLServer;Database=MYSQLDB;
Uid=USER;Pwd=PASSWORD",acTable,"SQLtable","MyAccessTable"

答案 1 :(得分:1)

使用链接表不需要在该链接表中存储或拥有用户密码。

如果在应用程序启动时执行SINGLE登录,则所有链接表都可以正常工作。

链接表在没有用户或密码提示的情况下工作。

链接表无需您在链接中存储用户ID或密码。

如果您按照此处的说明登录,Access将缓存用户名+密码:

http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx

所以要将表下载到本地,那么你只需要这个代码:

对于新的本地表(创建表查询):

CurrentDb.Execute "SELECT * INTO LocalTableCreate FROM ServerTable"

附加到现有表格:

CurrentDb.Execute "INSERT INTO LocalTable SELECT * FROM ServerTable"

如果存在一些非常奇怪的理由和欲望,就会创造并促进世界贫困,并且像乌龟那样艰难地做事,浪费时间而不是使用链接表?

您可以通过“transfer database”命令创建链接表。在上面的代码前面只有一行额外的代码,然后AGAIN上面两个例子可以正常工作。

但是我发现创建+删除链接表几乎没有任何好处。

我认为出于性能原因或者出于安全原因或您提前不知道该表的正当理由?然后我建议你使用保存的pass-though查询,因为性能会更快。

所以你可以使用这段代码:

Dim qdfPass       As DAO.QueryDef 
Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "select * from dbo.MyTable;" 


CurrentDb.Execute "INSERT INTO LocalTable SELECT * FROM MyPass”

请注意,上面qerydef中使用的sql必须是本机T-SQL,可以是视图甚至是存储过程,如:

qdfPass.SQL = "exec sp_myCoolStoreProc;" 

存储过程甚至可以传递如下参数:

qdfPass.SQL = "exec sp_myCoolStoreProc " & strMyParam

然后:

CurrentDb.Execute "INSERT INTO LocalTable SELECT * FROM MyPass”

因此,我们甚至可以通过执行上述操作来使用存储过程中的select into / append,而table / sql server端是动态的,甚至可以是存储过程。再次非常小的代码。

我建议你避免在这里提出写一个记录集循环代码的想法,除非你真的希望在不需要时编写循环代码。如果您使用此类循环,则必须在代码中单独处理类似PK的事情,因为可能需要跳过本地pk列(您只需将该列保留在select SQL之外)。

再次注意,为pass-though查询保存的连接字符串不需要用户ID和密码,只需使用上面的链接显示如何“登录”到SQL Server。如果表是已知的,那么再次保存的表链接或传递查询就足够了。