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!

Recommended Posts

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 to post

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...