Freigeben über


Aufrufen einer gespeicherten Prozedur (OLE DB)

Eine gespeicherte Prozedur kann null oder mehr Parameter aufweisen. Sie kann auch einen Wert zurückgeben. Bei Verwendung des OLE DB-Anbieters für sql Server Native Client können Parameter an eine gespeicherte Prozedur übergeben werden:

  • Hartcodieren des Datenwerts.

  • Verwenden Sie einen Parametermarker (?), um Parameter anzugeben, binden Sie eine Programmvariable an die Parametermarkierung, und platzieren Sie dann den Datenwert in der Programmvariable.

Hinweis

Beim Aufrufen von gespeicherten SQL Server-Prozeduren mit benannten Parametern mit OLE DB müssen die Parameternamen mit dem Zeichen "@" beginnen. Dies ist eine sql Server-spezifische Einschränkung. Der OLE DB-Anbieter von SQL Server Native Client erzwingt diese Einschränkung strenger als MDAC.

Zur Unterstützung von Parametern wird die ICommandWithParameters-Schnittstelle für das Befehlsobjekt verfügbar gemacht. Um Parameter zu verwenden, beschreibt der Consumer zunächst die Parameter für den Anbieter, indem die ICommandWithParameters::SetParameterInfo-Methode aufgerufen wird (oder optional eine aufrufende Anweisung vorbereitet wird, die die GetParameterInfo-Methode aufruft). Der Consumer erstellt dann einen Accessor, der die Struktur eines Puffers angibt, und platziert Parameterwerte in diesem Puffer. Schließlich wird das Handle des Accessors und ein Zeiger an den Puffer übergeben, um ausgeführt zu werden. Bei späteren Aufrufen von Execute platziert der Consumer neue Parameterwerte im Puffer und ruft "Execute " mit dem Accessorhandle und dem Pufferzeiger auf.

Ein Befehl, der eine temporäre gespeicherte Prozedur mithilfe von Parametern aufruft, muss zuerst ICommandWithParameters::SetParameterInfo aufrufen, um die Parameterinformationen zu definieren, bevor der Befehl erfolgreich vorbereitet werden kann. Dies liegt daran, dass sich der interne Name einer temporären gespeicherten Prozedur von dem externen Namen unterscheidet, der von einem Client verwendet wird, und SQLOLEDB kann die Systemtabellen nicht abfragen, um die Parameterinformationen für eine temporäre gespeicherte Prozedur zu ermitteln.

Dies sind die Schritte im Parameterbindungsprozess:

  1. Füllen Sie die Parameterinformationen in einem Array von DBPARAMBINDINFO-Strukturen aus; d. h. Parametername, anbieterspezifischer Name für den Datentyp des Parameters oder einen Standarddatentypnamen usw. Jede Struktur im Array beschreibt einen Parameter. Dieses Array wird dann an die SetParameterInfo-Methode übergeben.

  2. Rufen Sie die ICommandWithParameters::SetParameterInfo-Methode auf, um Parameter für den Anbieter zu beschreiben. SetParameterInfo gibt den systemeigenen Datentyp der einzelnen Parameter an. SetParameterInfo-Argumente sind:

    • Die Anzahl der Parameter, für die Typinformationen festgelegt werden sollen.

    • Ein Array von Parametern, für die Typinformationen festgelegt werden sollen.

    • Ein Array von DBPARAMBINDINFO-Strukturen.

  3. Erstellen Sie einen Parameteraccessor mithilfe des Befehls "IAccessor::CreateAccessor ". Der Accessor gibt die Struktur eines Puffers an und platziert Parameterwerte im Puffer. Der Befehl "CreateAccessor " erstellt einen Accessor aus einer Reihe von Bindungen. Diese Bindungen werden vom Consumer mithilfe eines Arrays von DBBINDING-Strukturen beschrieben. Jede Bindung ordnet dem Puffer des Consumer einen einzelnen Parameter zu und enthält Informationen wie:

    • Die Ordnungszahl des Parameters, auf den die Bindung angewendet wird.

    • Was gebunden ist (der Datenwert, seine Länge und sein Status).

    • Der Offset im Puffer auf jeden dieser Teile.

    • Die Länge und der Typ des Datenwerts, wie er im Puffer des Consumers vorhanden ist.

    Ein Accessor wird durch seinen Handle identifiziert, der vom Typ HACCESSOR ist. Dieses Handle wird von der CreateAccessor-Methode zurückgegeben. Wenn der Consumer die Verwendung eines Accessors beendet hat, muss der Consumer die ReleaseAccessor-Methode aufrufen, um den darin gespeicherten Speicher freizugeben.

    Wenn der Consumer eine Methode aufruft, z. B. "ICommand::Execute", übergibt er das Handle an einen Accessor und einen Zeiger an einen Puffer selbst. Der Anbieter verwendet diesen Accessor, um zu bestimmen, wie die im Puffer enthaltenen Daten übertragen werden.

  4. Füllen Sie die DBPARAMS-Struktur aus. Die Consumervariablen, aus denen Eingabeparameterwerte verwendet werden und in welche Ausgabeparameterwerte geschrieben werden, werden zur Laufzeit an ICommand::Execute in der DBPARAMS-Struktur übergeben. Die DBPARAMS-Struktur enthält drei Elemente:

    • Ein Zeiger auf den Puffer, aus dem der Anbieter Eingabeparameterdaten abruft und an die der Anbieter Ausgabeparameterdaten zurückgibt, entsprechend den vom Accessorhandle angegebenen Bindungen.

    • Die Anzahl der Sätze von Parametern im Puffer.

    • Das in Schritt 3 erstellte Accessorhandle.

  5. Führen Sie den Befehl mithilfe von "ICommand::Execute" aus.

Methoden zum Aufrufen einer gespeicherten Prozedur

Beim Ausführen einer gespeicherten Prozedur in SQL Server unterstützt der OLE DB-Anbieter von SQL Server Native Client folgendes:

  • ODBC CALL escape sequence.

  • Remoteprozeduraufruf (RPC) Escapesequenz.

  • Transact-SQL EXECUTE-Anweisung.

ODBC CALL Escape Sequence

Wenn Sie Parameterinformationen kennen, rufen Sie die ICommandWithParameters::SetParameterInfo-Methode auf, um die Parameter für den Anbieter zu beschreiben. Andernfalls ruft der Anbieter beim Aufrufen einer gespeicherten Prozedur eine Hilfsfunktion auf, um die Informationen zu den gespeicherten Prozedurparametern zu finden.

Wenn Sie nicht sicher sind, welche Parameterinformationen (Parametermetadaten) vorhanden sind, wird die ODBC-AUFRUFsyntax empfohlen.

Die allgemeine Syntax für das Aufrufen einer Prozedur mithilfe der ODBC CALL-Escapesequenz lautet:

{[?=]callprocedure_name[([parameter][,[parameter]]... )]}

Beispiel:

{call SalesByCategory('Produce', '1995')}  

RPC-Escapesequenz

Die RPC-Escapesequenz ähnelt der ODBC-AUFRUFsyntax des Aufrufens einer gespeicherten Prozedur. Wenn Sie die Prozedur mehrmals aufrufen, bietet die RPC-Escapesequenz die optimale Leistung zwischen den drei Methoden zum Aufrufen einer gespeicherten Prozedur.

Wenn die RPC-Escapesequenz zum Ausführen einer gespeicherten Prozedur verwendet wird, ruft der Anbieter keine Hilfsfunktion auf, um die Parameterinformationen zu ermitteln (wie bei odbc-AUFRUFsyntax). Die RPC-Syntax ist einfacher als die ODBC-AUFRUFsyntax, sodass der Befehl schneller analysiert und die Leistung verbessert wird. In diesem Fall müssen Sie die Parameterinformationen angeben, indem Sie ICommandWithParameters::SetParameterInfo ausführen.

Für die RPC-Escapesequenz ist ein Rückgabewert erforderlich. Wenn die gespeicherte Prozedur keinen Wert zurückgibt, gibt der Server standardmäßig "0" zurück. Darüber hinaus können Sie keinen SQL Server-Cursor für die gespeicherte Prozedur öffnen. Die gespeicherte Prozedur wird implizit vorbereitet, und der Aufruf von "ICommandPrepare::P repare " schlägt fehl. Aufgrund der Unfähigkeit, einen RPC-Aufruf vorzubereiten, können Sie keine Spaltenmetadaten abfragen; IColumnsInfo::GetColumnInfo und IColumnsRowset::GetColumnsRowset geben DB_E_NOTPREPARED zurück.

Wenn Sie alle Parametermetadaten kennen, ist die RPC-Escapesequenz die empfohlene Methode zum Ausführen gespeicherter Prozeduren.

Dies ist ein Beispiel für die RPC-Escapesequenz zum Aufrufen einer gespeicherten Prozedur:

{rpc SalesByCategory}  

Eine Beispielanwendung, die eine RPC-Escapesequenz veranschaulicht, finden Sie unter Execute a Stored Procedure (Using RPC Syntax) und Process Return Codes and Output Parameters (OLE DB).

Transact-SQL EXECUTE-Anweisung

Die ODBC-AUFRUF-Escapesequenz und die RPC-Escapesequenz sind die bevorzugten Methoden zum Aufrufen einer gespeicherten Prozedur anstelle der EXECUTE-Anweisung . Der OLE DB-Anbieter von SQL Server Native Client verwendet den RPC-Mechanismus von SQL Server, um die Befehlsverarbeitung zu optimieren. Dieses RPC-Protokoll erhöht die Leistung, indem ein Großteil der Parameterverarbeitung und -anweisungsanalyse auf dem Server eliminiert wird.

Dies ist ein Beispiel für die Transact-SQL EXECUTE-Anweisung :

EXECUTE SalesByCategory 'Produce', '1995'  

Siehe auch

Gespeicherte Prozeduren