zachy 10 Geschrieben 29. März 2015 Melden Teilen Geschrieben 29. März 2015 Hallo Forumsmitglieder, ich versuche über Access 2013 eine Gespeicherte Prozedur auf einem SQL Server 2014 auszuführen. Ich kenne mich zwar gut mit VBA aus und verstehe auch ein wenig von Transact SQL, aber das Zusammenspiel von Access und SQL Server ist für mich noch Neuland. Hier erst mal die SP: Create procedure [dbo].[Firmen_Und_Ort_Abfragen] as select [FrmID], [FrmNr], [FrmName], [OrtBezeichnung] from [dbo].[tblFirmen] left join [dbo].[tblOrte] on [OrtID] = [FrmOrt] order by [FrmName] Sie führt fragt einfach nur die Daten aus zwei Tabellen ab. Klappt auch hervorragend. Und jetzt der VBA-Code in Access, um die SP aufzurufen: Sub SP_Ausfuehren()Dim cn As New ADODB.ConnectionDim cmd As New ADODB.Command cn.Open "Provider=SQLOLEDB.1;User Id=sa;Password=passwort;Integrated Security=SSPI;DATA SOURCE=C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL;DATABASE=TestDB" cmd.CommandType = adCmdStoredProccmd.CommandText = "Firmen_Und_Ort_Abfragen"cmd.ActiveConnection = cn cmd.ExecuteEnd Sub Dieser Code erzeugt leider folgende Fehlermeldung: Laufzeitfehler '-2147467259(80004005)' [DBNETLIB][ConnectionOpen (Connect().]SQL Server existiert nicht oder Zugriff verweigert. Kann mir jemand sagen was sich falsch mache? Beste Grüße zachy Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 29. März 2015 Melden Teilen Geschrieben 29. März 2015 Entweder meldest Du Dich mit "SA" (SQLServer Authentication) an oder integriert mit dem aktuellen User. Beides zusammen klappt nicht. Schau mal hier https://www.connectionstrings.com/sql-server-2012/ Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 30. März 2015 Melden Teilen Geschrieben 30. März 2015 (bearbeitet) Passwörter im Code sind ganz schlecht. Lieber mit Trusted=Yes arbeiten. Bespiel: ODBC;DRIVER=SQL Server;SERVER=SQLServer\Instanz;DATABASE=MeineDatenbank;Trusted_Connection=Yes Das ganz am besten in eine lokale Tabelle und dann immer auslesen, falls nötig. Alternativ in der Registry ablegen. Dann kannst Du via Group Policy Preferences auch den SQL Server und die Datenbank abändern. Diesen Connectionstring kannst Du auch einfach in den Eigenschaften einer PT-Abfrage verwenden. Für die Recordsource von Formularen verwende ich PT-Abfragen schon. Hier noch eine kleine Funktion zum auslesen des Teils: Public Function GetODBC() As String On Error GoTo Fehler: GetODBC = DLookup("fldKeyWert", "tblKeys", "fldKey= 'ODBCVerbindungsstring'") exit_GetODBC: Exit Function Fehler: Call Protokoll("Fehler: " & Err.Number & " " & Err.description & " " & mModName & " & GetODBC() As String") Resume exit_GetODBC End Function Zusätzlich sehr sehenswert ist der Inhalt dieses ZIP: http://www.donkarl.com/Downloads/AEK/AEK17_LogikSQLServer.zip Ein Vortrag von Bernd Jungbluth zu diesem Thema. Eine Beispiel Datenbank zum 'nachmachen' ist ebenfalls dabei. Auch SQL Scripte sind vorhanden. Als Basis kann dieser Artikel dienen: http://support.microsoft.com/en-us/kb/184749 Public Function AnzahlDStblSoftware(strTable As String) As Integer On Error GoTo Fehler: AnzahlDStblSoftware = 0 Dim db As DAO.Database Dim rs As DAO.Recordset If strConnect = "" Or IsNull(strConnect) Then strConnect = GetODBC() End If Set db = DBEngine.Workspaces(0).OpenDatabase("", False, False, strConnect) Dim strSQL As String strSQL = "AnzahlDS " & strTable db.Execute strSQL, dbSQLPassThrough ' For SPs that return rows. Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot, dbSQLPassThrough) AnzahlDStblSoftware = rs!anz exit_AnzahlDStblSoftware: Exit Function Fehler: Dim i As Integer For i = 0 To Errors.Count - 1 Call HandleError(mModName & ".AnzahlDStblSoftware() as Integer" & Errors(i)) Next i Resume exit_AnzahlDStblSoftware End Function AnzahlDS ist die SP auf dem SQL Server, in strTable steht die Tabelle die es betrifft. BTW: Du siehst in der Fehlerbehandlung wird die Errorsauflistung durchlaufen, tust Du das nicht, bekommst Du immer nur den Fehler 3146 ODBC-Aufruf fehlgeschlagen zurück. So kriegst Du einen richtigen Grund genannt. USE [MeineDatenbank] GO /****** Object: StoredProcedure [dbo].[AnzahlDS] Script Date: 30.03.2015 08:18:31 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER Procedure [dbo].[AnzahlDS] @TableName VarChar(100) AS Declare @SQL VarChar(1000) SELECT @SQL = 'SELECT COUNT(*) AS Anz FROM ' SELECT @SQL = @SQL + @TableName Exec ( @SQL) bearbeitet 30. März 2015 von Sunny61 Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 30. März 2015 Melden Teilen Geschrieben 30. März 2015 Ausserdem: Datasource sollte im Format SERVER\INSTANZ sein, nicht ein Laufwerkspfad! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.