none
Abfrage mit Parameter auf SQL-Server ausführen RRS feed

  • Frage

  • Ich möchte von Access aus eine Abfrage auf einem SQL-Server ausführen und das Ergebnis (Reocrdset) dann in einer Untertabelle darstellen.

    Ich habe dazu eine Menge Informationen gefunden, leider bekomme ich nicht das gewünschte Ergebnis.

    Eine Pass-through-ABfrage scheint keine Parameter zu ermöglichen.

    Also habe ich das ganze mit einer stored procedure probiert. AUf dem SQL-Server funktioniert das mit 

    exec sp_searchforkeywords  '<MEINTEXT>'

    Leider bekomme  ich mit dem nachfolgenden Code nicht das geüwnschte Ergebnis:

     objConn.ConnectionString = "driver={SQL Server};Server=GALILEO2020;Database=DocMgmt;Trusted_Connection=yes;"
     objConn.Open
    
    
      'Set CommandText equal to the stored procedure name.
     objCmd.CommandText = "sp_searchforKeywords"
     objCmd.CommandType = adCmdStoredProc
    
      'Connect to the data source.
     Set objConn = GetNewConnection
     objCmd.ActiveConnection = objConn
    
      'Automatically fill in parameter info from stored procedure.
     objCmd.Parameters.Refresh
    
      Set the param value.
     'objCmd.Parameters.Append objCmd.CreateParameter("@keywords", adVarChar, adParamInput, , Me.txt_searchstring)
     objCmd.Parameters(1) = Me.txt_searchstring
    
     ' Execute once and display...
     objRs.CursorType = adOpenDynamic
     Set objRs = objCmd.Execute
     objRs.Close
     objRs.CursorType = adOpenKeyset
     objRs.Open
     Debug.Print "Records", objRs.RecordCount
    

    RecordCount ist immer -1, egal was ich als Suchparameter angebe

    Sonntag, 3. Januar 2021 09:12

Alle Antworten

  • Hi,

    was genau gibst Du denn als Parameterwert an?

    Ich hab das grad mal nachgestellt (hab es neu aufgebaut, damit alles, was nicht benötigt wird, nicht unnötig verwirrt):

    Dim ConnectionString
        ConnectionString = "..."
    Dim Connection
    Dim Recordset
    Dim Command
    
    Set Connection = CreateObject( "ADODB.Connection" )
        Connection.Open ConnectionString
    
    Set Command = CreateObject( "ADODB.Command" )
        Command.CommandText      = "sp_searchforKeywords"
        Command.CommandType      = adCmdStoredProc
        Command.ActiveConnection = Connection
        Command.Parameters( 1 )  = "Suchbegriff"
    
    Set Recordset = CreateObject( "ADODB.Recordset" )
        Recordset.Open Command, , 1, 1
    
        Response.Write Recordset.RecordCount
    
    Set Command = Nothing
    
        Recordset.Close
    Set Recordset = Nothing
    
        Connection.Close
    Set Connection = Nothing

    Klappt einwandfrei. Die SP dazu sieht so aus:

    CREATE PROCEDURE [dbo].[sp_searchforKeywords]
    	@keywords NVARCHAR( MAX ) = NULL
    AS
        SELECT *
        FROM   <Tabelle>
        WHERE  <Spalte> LIKE '%' + @keywords + '%'
    GO

    Daher denke ich mal, es liegt an dem, was Du an die SP übergibst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 3. Januar 2021 11:29
    Moderator
  • DIes ist die stored procedure:

    ALTER PROCEDURE [dbo].[sp_SearchforKeywords] 
    	-- Add the parameters for the stored procedure here
    	@keywords nvarchar(500)
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
    	select stream_id, name, file_type, creation_time, last_access_time,last_write_time,is_directory, file_stream.GetFileNamespacePath()  
    	from dbo.Dokumente where contains(file_stream,@keywords)
    END

    Ich probiere mal den Code aus. So riesig ist der UNterschied aber nicht

    Sonntag, 3. Januar 2021 18:07
  • Hi,

    dann halt nochmal die Frage:

    was genau gibst Du denn als Parameterwert an?

    <Recordset>.RecordCount deutet oftmals auch auf falsche Parameter beim Öffnen des Recordsets hin (was u.a. beim Aufruf von <Connection>.Execute ohne weitere Angaben passiert, da dann Standardwerte verwendet werden). Allerdings hat es auch mit deinem Code bei mir geklappt. Deswegen denke ich auch eher, dass es an deinem Parameterwert liegt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 3. Januar 2021 19:46
    Moderator
  • Okay. Ich hoffe, das hier hilft weiter:

    exec sp_searchforkeywords 'AXA'

    liefert  in SSMS 3 Datensätze; das Stichwort in meiner Access-DB eingegeben wieder -1 als Record-Count

    Muss man die ' ' etwa mit liefern?

    Montag, 4. Januar 2021 07:21
  • Hi,

    ne, daran liegt es dann wohl doch nicht. In dem Fall dann eher an den falschen Parametern beim Öffnen des Recordsets per Execute. Falls nichts gefunden werden würde, käme ansonsten bei RecordCount 0 und nicht -1.

    Probier's mal mit meiner Variante, die sollte eigentlich gehen.

    Falls nicht, schau mal bitte mit dem SQL Server Profiler oder ähnlichem, was genau auf dem SQL Server als Statement ankommt und wie dessen Ergebnis aussieht.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Montag, 4. Januar 2021 07:40
    Moderator
  • RecordCount ist immer -1, egal was ich als Suchparameter angebe

    Würde die Abfrage kein Ergebnis liefern, wäre RecordCount = 0. -1 bedeutet, das ADO nicht die finale Anzahl Datensätze ermitteln kann, siehe RecordCount Property (ADO) => Remarks: "The property returns -1 when ADO cannot determine the number of records or if the provider or cursor type does not support RecordCount". Führe ein MoveLast+MoveFirst, dann sollte die Anzahl Datensätze ADO bekannt sein.

    sp_searchforKeywords

    Benenne Stored Procedures besser nicht mit dem Präfix "sp_", das ist Systemprozeduren vorbehalten, siehe CREATE PROCEDURE (Transact-SQL) => Arguments: "Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name."


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 5. Januar 2021 07:54
  • Danke für den Hinweis. Ich werde die Prozedur umbenennen.

    Ich habe in der Tat noch nie probiert, ob -1 bedeutet, daß auch keine Datensätze geliefert wurden.

    Definitiv funktioniert MoveLast - MoveFirst nicht. Das gibt eine Fehlermeldung, daß der Provider dies nicht unterstützt.

    Freitag, 8. Januar 2021 10:15