none
Ausführen einer store procedure auf dem SQL von Access aus

    Frage

  • Ich habe Porbleme eine stored procedure von Access (2007/2010) aus auzuführen.

    Mit der stored procedure wird eine Volltextsuche in der file_stream-Spalte einer  FILETABLE durchgeführt.

    Der Parameter ist der Suchstring.

    Das funktioniert im Grunde auf dem SQL-Server auch ganz gut.

    Nun möchte ich in meinem ACCESS-Fomular diesen Suchparamter eingeben, auf dem SQL-Server suchen lassen und ein Recordset zurückbekommen, mit dem ich einUnterformular fülle.

    Ist das überhaupt der richtige Weg?

    Eine normale Abfrage erscheint mir ungeeeignet, da meines Wissens Suche mit CONTAINS nur auf dem SQL selber geht.

    Zum anderen bekomme ich eine Fehlermeldung, die besagt, ich hätte den Parameter nicht angegeben, obwohl er da ist.

    Ich baue eine ADODB.Connection auf und übermittle dann mit ADODB.command und .Parameter("@suchstring").value den eigentlichen WertIn der Fehlermeldung wird anstatt des Parameters nur ein ? genannt

    Was mache ich falsch ?

    Freitag, 27. Juni 2014 09:24

Antworten

  • Hi,

    ich habe das wie folgt gemacht:

    1. Pass-Through-Abfrage mit
      Exec cIONM_APS_Data_Side_sp  1664, 1, 2
      erstell (hinten sind meine Parameter) und in dem Formular verbaut (SubForm usw.)
    2. in Form_Current das SQL-Statment mit den gewünschten Parametern geändert und aktualisiert (Requery)
      CurrentDb().QueryDefs("APS_Data_Side_sp").sql = "Exec cIONM_APS_Data_Side_sp " & Str$(idbID) & "," & Str$(iAPSSe) & "," & Str$(iChannel)
      Me.DiaAPS_Rel.Requery

    mfg Carsten

    • Als Antwort markiert NicoNi Mittwoch, 2. Juli 2014 20:18
    Mittwoch, 2. Juli 2014 13:03

Alle Antworten

  • mit ADODB.command und .Parameter("@suchstring").value den eigentlichen WertIn der Fehlermeldung wird anstatt des Parameters nur ein ? genannt

    Hallo Nico,

    benannte Parameter die mit @ beginnen, gibt es im SQL Server und in ADO.NET, bei OleDB (wie hier ADODB) und ODBC verwendet man das Fragezeichen als Parameter-Platzhalter; dem Command Objekt muss man die Parameter dann in der richtigen Reihenfolge wie in der Abfrage hinzufügen.

    Siehe Parameters and Return Codes in the Execute SQL Task => Using Parameter Names and Markers (auch wenn der Artikel zu SSIS gehört) oder OleDbParameter Class (auch wenn das ADO.NET ist)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Freitag, 27. Juni 2014 11:09
  • Heisst das, ich müsste .Parameter(0) angeben, anstatt @suchstring?

    BLiebe noch die Frage, ob der WEg über eine stored procedure und Rückgabe eines Recordset der richtige Ansatz ist.

    Freitag, 27. Juni 2014 12:13
  • Genau mit .Parameter(<index>), kleine Codebeispiele kannst Du hier finden: Using ADO in VB and Access

    Ob Du eine direktes Select Statement oder eine Stored Procedure verwendest, soll eigentlich zum gleichen Ergebnis führen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 27. Juni 2014 12:29
  • Ahh okay.

    Aber man darf keine Verknüpfung in Access auf die FILETABLE verwenden und dann eine Access-Abfrage nutzen - richtig ? Das dürfte Access überfordern.

    Freitag, 27. Juni 2014 12:40
  • Am 27.06.2014 schrieb NicoNi:

    Ich habe Porbleme eine stored procedure von Access (2007/2010) aus auzuführen.

    Mit der stored procedure wird eine Volltextsuche in der file_stream-Spalte einer  FILETABLE durchgeführt.

    Der Parameter ist der Suchstring.

    Das funktioniert im Grunde auf dem SQL-Server auch ganz gut.
    Nun möchte ich in meinem ACCESS-Fomular diesen Suchparamter eingeben, auf dem SQL-Server suchen lassen und ein Recordset zurückbekommen, mit dem ich einUnterformular fülle.

    Das kann so funktionieren:

    Public Function AnzahlDStblSoftware(strTable As String) As Integer
    On Error GoTo Fehler:
    
            AnzahlDStblSoftware = 0
            Dim db As DAO.Database
            Dim rs As DAO.Recordset
            Set db = DBEngine.Workspaces(0).OpenDatabase("", False, False, strConnect)
            Dim strSQL As String
            strSQL = "AnzahlDS " & strTable
            db.Execute strSQL, dbSQLPassThrough
            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 heißt die Stored Procedure, in der SP heißt Anz das Feld das
    den Wert zurück liefert. Funktioniert mit DAO wunderbar.

    Zum anderen bekomme ich eine Fehlermeldung, die besagt, ich hätte den Parameter nicht angegeben, obwohl er da ist.

    Ohne deinen Code kann man nur raten.

    Was mache ich falsch ?

    Ich warte noch auf Antwort in dem anderen Thread.
    http://social.Msdn.microsoft.com/Forums/de-DE/sqlserverde/thread/b4c9a21c-160e-4c64-ab2d-e1c27b62bc9c#b4c9a21c-160e-4c64-ab2d-e1c27b62bc9c


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Freitag, 27. Juni 2014 13:20
  • Hast Du schon mit einer PassThrough Query versucht?

    Leg eine neue PassThrough Query an und setze den Connect String so, dass er auf den SQL Server verweist.

    Dann fülle den  SQL Parameter mit dem kompletten Text des Aufrufs der Stored Procedure wie wenn Du diese im SQL Server aufrufen würdest. Parameter kannst Du hier nicht brauchen, Du musst also den Inhalt der Parameter direkt in den SQL Text abfüllen.

    Dann kannst Du diese PassThrough Abfrage benutzen, um den Befehl auf dem SQL Server ausführen zu lassen und erhälst das Result Set von diesem zurück.

    Wieweit da das FileStream Object auf dem Client ankommt, weiss ich nicht.

    Hier ein Beispiel (Annahme, Du hast eine gelinkte Tabelle, welche "DeineTabelle" heisst). Nachfolgendes Beispiel legt eine temporäre Query an, mit der dann ein Recordset geöffnet wird.

    Dim db As Database
    Dim rs as Recordset
    Dim qdf as QueryDef
    Dim strSQL As String
    Set DB = CurrentDb()
    strSQL = "EXECUTE dbo.DeineSP 'Parameter1', 'Parameter2'"
    Set qdf = db.CreateQueryDef("")
    qdf.ReturnsRecords = True
    qdf.Connect = db.TableDefs("DeineTabelle").Connect
    qdf.SQL = strSQL
    Set rs = qdf.OpenRecordset
    While Not rs.EOF
      '.. mache etwas mit dem Recordset
      rs.MoveNext
    Wend
    rs.Close
    Set qdf = Nothing
    Set db = Nothing

    Gruss

    Henry


    Dienstag, 1. Juli 2014 05:42
  • Hi,

    ich habe das wie folgt gemacht:

    1. Pass-Through-Abfrage mit
      Exec cIONM_APS_Data_Side_sp  1664, 1, 2
      erstell (hinten sind meine Parameter) und in dem Formular verbaut (SubForm usw.)
    2. in Form_Current das SQL-Statment mit den gewünschten Parametern geändert und aktualisiert (Requery)
      CurrentDb().QueryDefs("APS_Data_Side_sp").sql = "Exec cIONM_APS_Data_Side_sp " & Str$(idbID) & "," & Str$(iAPSSe) & "," & Str$(iChannel)
      Me.DiaAPS_Rel.Requery

    mfg Carsten

    • Als Antwort markiert NicoNi Mittwoch, 2. Juli 2014 20:18
    Mittwoch, 2. Juli 2014 13:03
  • Das ist eine entschieden einfachere Variante.

    Ich werde es ausprobieren

    Mittwoch, 2. Juli 2014 20:18