如何将数据从SQL Server表追加到Access表

时间:2019-01-18 16:57:45

标签: sql sql-server vba ms-access access-vba

我试图弄清楚如何在MS Access中编写查询,该查询将打开与本地SQL Server的连接,然后允许我将选择表导入MS Access。

我将在下面粘贴我的代码的副本。请让我知道如何解决。它似乎一直运行到Cn.Execute语句为止。我得到

  

运行时错误'-2471765(80040e37)'[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称'dbo_SQLServertable'。

也将需要导入其他表,因此我需要一个可以在工作时可以更改表名的代码。

Private Sub Command28_Click()


 Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim SQLStr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    Server_Name = "" ' Enter your server name here
    Database_Name = "Test" ' Enter your database name here
    User_ID = "" ' enter your user ID here
    Password = "" ' Enter your password here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";"

    Cn.Execute "INSERT INTO Access Table SELECT dbo_SQLServerTable.* FROM dbo_SQLServerTable;"

    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing

*****更新***** 大家好,谢谢您到目前为止的答复。他们都帮了忙。我进行了一些更新,现在收到新的错误消息

  

运行时错误'-2147216900(80040e14)'[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法将值NULL插入列'DiagnosisOrdinal'的表'Office.dbo.Test'列中空值。插入失败。

看来,我的插入语句仍在引用(或尝试引用)SQL Server中的表。 “ Office”是我要提取的数据库名称。

是否必须关闭连接,然后将数据粘贴到本地Access表中?如果要对多个表执行此操作,是否需要重新打开并关闭连接?

我已将我的execute语句更改为

执行“插入到访问表SELECT dbo_SQLServerTable。* FROM dbo_SQLServerTable;”中

执行“从dbo.SQLServerTable中插入到测试(VisitID,提供程序)SELECT VisitID,提供程序;”

再次感谢您的帮助。我们接近了!

4 个答案:

答案 0 :(得分:0)

您不希望SQL表中的SELECT中具有表前缀。不过,SELECT * FROM dbo_SQLServerTable;的最佳做法就是不要使用SELECT *,而要指定列,以防表模式发生更改。

答案 1 :(得分:0)

对此特定问题有一些建议

  1. 通过查询传递
  2. SQL Server中的链接表。您将不得不设置一个dsn文件,这并不是太困难。
  3. 或直接在SQL Server Insert into Access from SQL Server
  4. 中处理它
  5. 通过VBA进行ODBC连接(您正在做什么,而且看似最费劲)

所有这些方法都可以正常工作。我建议使用链接表,这样您就不会重复数据,但这对您来说是件麻烦事,因为我不了解项目的要求。

答案 2 :(得分:0)

dbo_SQLServerTable是Access表名,而不是SQL Server表名。因为您已经创建了链接表dbo_SQLServerTable,所以可以使用以下VBA代码。

Currentproject.connection.execute "INSERT INTO MyAccessTable(fld1, fld2, fld3) SELECT fld1, fld2,fld3 FROM dbo_SQLServerTable"

无需在VBA代码中创建连接对象。始终可以引用Currentproject.connection。

答案 3 :(得分:0)

我能想到的最少的代码是使用传递查询。

设置对相关服务器数据库的PT查询。

然后,用于在访问中创建新表的代码如下:

Sub TestImport()

  Dim strSQL     As String

  With CurrentDb.QueryDefs("qryPassR")
     .SQL = "select * from tblHotels"
  End With

  Dim strLocalTable  As String

  strLocalTable = "zoo"

  CurrentDb.Execute "select * into " & strLocalTable & " FROM qryPassR"

End Sub

以上内容当然假设您在创建PT查询时设置了到sql服务器(一个数据库)的连接。上面的方法很好,因为您不会在代码中弄乱连接字符串。

但是,鉴于您需要(想要)指定数据库(以及可能的服务器),因此上面的内容如下:

Sub TestImport2()

  Dim strSQL           As String
  Dim strServer        As String
  Dim strDatabase      As String
  Dim strUser          As String
  Dim strPass          As String

  strServer = ""
  strDatabse = ""
  strUser = ""
  strPass = ""

  Dim strLocalTable       As String
  Dim strServerTable      As String

  With CurrentDb.QueryDefs("qryPassR")
     .Connect = dbCon(strServer, strDatabase, strUser, strPass)
     .SQL = "select * from " & strServerAble
  End With

  CurrentDb.Execute "select * into " & strLocalTable & " FROM qryPassR"

End Sub

上面使用“方便”功能创建您的连接字符串。

该功能如下:

Public Function dbCon(ServerName As String, _
                     DataBaseName As String, _
                     Optional UserID As String = "", _
                     Optional USERpw As String, _
                     Optional APP As String = "Office 2010", _
                     Optional WSID As String = "Import") As String

   ' returns a SQL server conneciton string

  dbCon = "ODBC;DRIVER=" & SQLDRIVER & ";" & _
          "SERVER=" & ServerName & ";" & _
          "DATABASE=" & DataBaseName & ";"
          If UserID <> "" Then
             dbCon = dbCon & "UID=" & UserID & ";" & "PWD=" & USERpw & ";"
          End If
          dbCon = dbCon & _
          "APP=" & APP & ";" & _
          "WSID=" & WSID & ";" & _
          "Network=DBMSSOCN"

End Function

编辑

海报要求提供将数据附加到现有表中的解决方案。

在这种情况下,只需更改以下内容即可:

  CurrentDb.Execute "select * into " & strLocalTable & " FROM qryPassR"

收件人

  CurrentDb.Execute "INSERT INTO " & strLocalTable & " SELECT * FROM qeryPassR"