我试图弄清楚如何在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,提供程序;”
再次感谢您的帮助。我们接近了!
答案 0 :(得分:0)
您不希望SQL表中的SELECT中具有表前缀。不过,SELECT * FROM dbo_SQLServerTable;
的最佳做法就是不要使用SELECT *
,而要指定列,以防表模式发生更改。
答案 1 :(得分:0)
对此特定问题有一些建议
所有这些方法都可以正常工作。我建议使用链接表,这样您就不会重复数据,但这对您来说是件麻烦事,因为我不了解项目的要求。
答案 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"