Ich versuche herauszufinden, wie eine Abfrage in MS Access geschrieben wird, die eine Verbindung zu einem lokalen SQL Server herstellt, und ich kann dann ausgewählte Tabellen in MS Access importieren.

Ich werde unten eine Kopie meines Codes einfügen. Bitte lassen Sie mich wissen, wie das Problem behoben werden kann. Es scheint bis zur Anweisung Cn.Execute zu laufen. Ich bekomme

Laufzeitfehler '-2471765 (80040e37)' [Microsoft] [ODBC SQL Server-Treiber] [SQL Server] Ungültiger Objektname 'dbo_SQLServertable'.

Muss auch zusätzliche Tabellen importieren, damit ich einen Code brauche, der bei der Arbeit funktioniert, wenn ich die Tabellennamen ändern kann.

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

***** UPDATE ***** Hallo zusammen, danke für die bisherigen Antworten. Sie waren alle eine Hilfe. Ich habe einige Updates vorgenommen und erhalte jetzt eine neue Fehlermeldung

Laufzeitfehler '-2147216900 (80040e14)' [Microsoft] [ODBC SQL Server-Treiber] [SQL Server] Der Wert NULL kann nicht in die Spalte 'DiagnosisOrdinal' eingefügt werden. Die Tabelle 'Office.dbo.Test' lässt keine Nullen zu. Einfügen schlägt fehl.

Es scheint, dass meine insert-Anweisung immer noch auf eine Tabelle im SQL Server verweist (oder versucht, darauf zu verweisen). 'Office' ist der Datenbankname, aus dem ich ziehe.

Muss ich die Verbindung schließen und dann die Daten in meine lokale Zugriffstabelle einfügen? Muss ich dann die Verbindung erneut öffnen und schließen, wenn ich dies für mehrere Tabellen tun möchte?

Ich habe meine execute-Anweisung von geändert

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

Zu

Cn.Execute "INSERT INTO Test (VisitID, Provider) SELECT VisitID, Provider FROM dbo.SQLServerTable;"

Danke nochmal für all deine Hilfe. Wir sind nah!

0
gbengel 18 Jän. 2019 im 19:57

4 Antworten

Beste Antwort

Die geringste Menge an Code, die mir einfällt, ist die Verwendung einer Pass-Through-Abfrage.

Richten Sie eine PT-Abfrage für die betreffende Serverdatenbank ein.

Dann würde Ihr Code zum Erstellen einer neuen Tabelle im Zugriff folgendermaßen aussehen:

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

Im obigen Beispiel wird natürlich davon ausgegangen, dass Sie die Verbindung zum SQL Server (eine Datenbank) eingerichtet haben, als Sie die PT-Abfrage erstellt haben. Der obige Ansatz ist nett, da Sie nicht mit Verbindungszeichenfolgen im Code herumspielen.

Wenn Sie jedoch die Datenbank (und den wahrscheinlichen Server) angeben müssen (möchten), lautet das Folgende wie folgt:

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

Das obige verwendet eine "praktische" Funktion, um Ihre Verbindungszeichenfolge zu erstellen.

Diese Funktion ist wie folgt:

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

Bearbeiten

Poster hat nach einer Lösung gefragt, um Daten an eine EXISTING-Tabelle anzuhängen.

Ändern Sie in diesem Fall einfach Folgendes:

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

Zu

  CurrentDb.Execute "INSERT INTO " & strLocalTable & " SELECT * FROM qeryPassR"
0
Albert D. Kallal 18 Jän. 2019 im 22:21

Sie möchten nicht, dass das Tabellenpräfix in Ihrem SELECT aus der SQL-Tabelle stammt. Führen Sie einfach SELECT * FROM dbo_SQLServerTable; aus. Es wird jedoch nicht empfohlen, SELECT * zu verwenden, sondern die Spalten anzugeben, falls sich die Tabellenschemata jemals ändern.

0
squillman 18 Jän. 2019 im 17:04

Es gibt einige Vorschläge für dieses spezielle Problem

  1. Fragen weiterleiten
  2. Verknüpfte Tabellen von SQL Server. Sie müssen häufig eine DSN-Datei einrichten, die nicht allzu schwierig ist.
  3. Oder behandeln Sie es direkt in SQL Server Von SQL Server in Access einfügen
  4. ODBC-Verbindung über VBA (was machst du und scheinbar am kompliziertesten)

Alle diese Ansätze werden gut funktionieren. Ich schlage verknüpfte Tabellen vor, damit Sie keine Daten duplizieren, aber das ist eine Zusammenfassung für Sie, da ich die Anforderungen des Projekts nicht kenne.

0
Doug Coats 18 Jän. 2019 im 17:13

Dbo_SQLServerTable ist ein Access-Tabellenname, kein SQL Server-Tabellenname. Da Sie die verknüpfte Tabelle dbo_SQLServerTable bereits erstellt haben, können Sie den folgenden VBA-Code verwenden.

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

Es ist nicht erforderlich, ein Verbindungsobjekt im VBA-Code zu erstellen. Currentproject.connection ist immer verfügbar, um referenziert zu werden.

0
Seaport 18 Jän. 2019 im 17:51