Jump to content

Aufruf einer SP über Access erzeugt einen Fehler


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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.Connection
Dim 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 = adCmdStoredProc
cmd.CommandText = "Firmen_Und_Ort_Abfragen"
cmd.ActiveConnection = cn
   
cmd.Execute
End 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

Link zu diesem Kommentar

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 von Sunny61
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...