Befehlsparameter
Parameter werden im Befehlstext durch ein Fragezeichen markiert. Zum Beispiel wurde die folgende SQL-Anweisung für einen einzelnen Eingabeparameter markiert:
{call SalesByCategory('Produce', ?)}
Um die Leistung durch eine Reduzierung des Netzwerkverkehrs zu verbessern, leitet der OLE DB-Anbieter von SQL Server Native Client nicht automatisch Parameterinformationen ab, sondern nur dann, wenn vor der Befehlsausführung ICommandWithParameters::GetParameterInfo oder ICommandPrepare::Prepare aufgerufen wird. Dies bedeutet, dass der OLE DB-Anbieter von SQL Server Native Client Folgendes nicht automatisch durchführt:
Überprüfen der Korrektheit des mit ICommandWithParameters::SetParameterInfo angegebenen Datentyps
Zuordnen des in den Accessor-Bindungsinformationen angegebenen DBTYPE zum korrekten SQL Server-Datentyp für den Parameter
Bei Einsatz dieser beiden Methoden können in Anwendungen möglicherweise Fehler oder Genauigkeitsverluste auftreten, wenn Datentypen angegeben werden, die nicht mit dem SQL Server-Datentyp des Parameters kompatibel sind.
Um dies zu vermeiden, sollte die Anwendung Folgendes tun:
Sicherstellen, dass pwszDataSourceType dem SQL Server-Datentyp für den Parameter entspricht, wenn ICommandWithParameters::SetParameterInfo fest codiert wird
Sicherstellen, dass der DBTYPE–Wert, der an den Parameter gebunden wird, vom gleichen Typ wie der SQL Server-Datentyp des Parameters ist, wenn ein Accessor fest codiert wird.
Aufrufen von ICommandWithParameters::GetParameterInfo, damit der Anbieter die SQL Server-Datentypen der Parameter während der Laufzeit ermitteln kann. Beachten Sie, dass dies einen zusätzlichen Netzwerkroundtrip zum Server bedingt.
Hinweis |
---|
Der Anbieter unterstützt den Aufruf von ICommandWithParameters::GetParameterInfo nicht in Verbindung mit SQL Server UPDATE- oder DELETE-Anweisungen, die eine FROM-Klausel enthalten; SQL-Anweisungen, die von einer Unterabfrage mit Parametern abhängen; SQL-Anweisungen, die Parametermarkierungen in beiden Ausdrücken eines Vergleichs oder quantifizierten Prädikats enthalten; oder Abfragen, in denen ein Parameter ein Funktionsparameter ist. Bei der Verarbeitung von Batches von SQL-Anweisungen unterstützt der Anbieter überdies keine Aufrufe von ICommandWithParameters::GetParameterInfo für Parametermarkierungen in Anweisungen, die der ersten Anweisung im Batch folgen. Wenn im Transact-SQL-Befehl Kommentare (/* */) nicht zulässig sind. |
Der OLE DB-Anbieter von SQL Server Native Client unterstützt Eingabeparameter in SQL-Anweisungsbefehlen. In Prozeduraufrufbefehlen unterstützt der OLE DB-Anbieter von SQL Server Native Client Eingabe-, Ausgabe- und Eingabe/Ausgabe-Parameter. Ausgabeparameterwerte werden entweder nach der Ausführung (nur wenn keine Rowsets zurückgegeben werden) oder nach Abschluss der Rowsetverarbeitung durch die Anwendung an die Anwendung zurückgegeben. Um sicherzustellen, dass zurückgegebene Werte gültig sind, verwenden Sie IMultipleResults, um den Einsatz von Rowsets zu erzwingen.
Die Namen der Parameter von gespeicherten Prozeduren müssen nicht in einer DBPARAMBINDINFO-Struktur angegeben werden. Geben Sie durch die Angabe von NULL als Wert für das pwszName-Element an, dass der OLE DB-Anbieter von SQL Server Native Client den Parameternamen ignorieren und nur die Ordinalzahl verwenden soll, die im rgParamOrdinals-Element von ICommandWithParameters::SetParameterInfo angegeben wurde. Wenn der Befehlstext sowohl benannte als auch unbenannte Parameter enthält, dann müssen alle unbenannten Parameter vor den benannten Parametern angegeben werden.
Wenn der Name eines Parameters einer gespeicherten Prozedur angegeben wird, dann überprüft der OLE DB-Anbieter von SQL Server Native Client den Namen, um seine Gültigkeit sicherzustellen. Der OLE DB-Anbieter von SQL Server Native Client gibt einen Fehler zurück, wenn er vom Consumer einen fehlerhaften Parameternamen erhält.
Hinweis |
---|
Um Unterstützung für SQL Server XML-Typen und benutzerdefinierte Typen (UDT) verfügbar zu machen, implementiert der OLE DB-Anbieter von SQL Server Native Client eine neue ISSCommandWithParameters-Schnittstelle. |