Delen via


Gegevens invoegen in Table-Valued parameters

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform Systeem (PDW)SQL-database in Microsoft Fabric

OLE DB-stuurprogramma downloaden

De OLE DB Driver voor SQL Server ondersteunt twee modellen waarmee de consument gegevens specificeert voor tabelwaardige parameterrijen: een pushmodel en een pull-model.

Opmerking

Een kolom met tabelwaarde moet ofwel niet-standaardwaarden in alle rijen of standaardwaarden in alle rijen hebben. Het is niet mogelijk om standaardwaarden in sommige rijen te hebben, maar in andere niet. Daarom zijn bij tabelwaarde-parameterbindingen de enige toegestane statuswaarden voor tabelwaardige parameter-rijsetkolomgegevens DBSTATUS_S_ISNULL en DBSTATUS_S_OK. DBSTATUS_S_DEFAULT zal resulteren in een storing en de gebonden statuswaarde wordt ingesteld op DBSTATUS_E_BADSTATUS.

Pushmodel (laadt alle parameters Table-Valued in het geheugen)

Het pushmodel lijkt op het gebruik van parametersets (dat wil zeggen, de DBPARAMS-parameter in ICommand::Execute). Het pushmodel wordt alleen gebruikt als tabelwaardige parameter-rowsetobjecten worden gebruikt zonder een aangepaste implementatie van IRowset-interfaces. Het push-model wordt aanbevolen wanneer het aantal rijen in de tabelwaardige parameterrijset klein is en niet wordt verwacht dat het de applicatie buitensporig druk op het geheugen legt. Dit is eenvoudiger dan het pull-model, omdat het niet meer functionaliteit van de consumentenapplicatie vereist dan wat momenteel gebruikelijk is in typische OLE DB-toepassingen.

Van de consument wordt verwacht dat hij alle tabelwaardige parametergegevens aan de provider verstrekt voordat een commando wordt uitgevoerd. Om de gegevens te leveren, vult de consument voor elke tabelwaardige parameter een tabelwaardeparameter rijsetobject in. Het tabelwaardeparameter rijsetobject toont de invoeg-, set- en verwijderbewerkingen van de rijset, die de consument zal gebruiken om de tabelwaardige parametergegevens te manipuleren. De provider haalt de gegevens op van dit tabel-waarde parameter rowset-object tijdens de uitvoering.

Wanneer een tabelwaarde-parameter rowset-object aan de consument wordt geleverd, kan de consumer het verwerken als een rowset-object. De consument kan de type-informatie van elke kolom (type, maximale lengte, precisie en schaal) verkrijgen door gebruik te maken van de IColumnsInfo::GetColumnInfo of IColumnsRowset::GetColumnsRowset-interfacemethode. De consument maakt vervolgens een accessor aan om de bindings voor de data te specificeren. De volgende stap is het invoegen van rijen gegevens in de tabelwaardige parameterrijset. Dit kan gedaan worden door IRowsetChange::InsertRow te gebruiken. IRowsetChange::SetData of IRowsetChange::D eleteRows kunnen ook worden gebruikt op het table-valued parameter rowset-object als je de data moet manipuleren. Tabelwaardige parameter-rijsetobjecten worden referentiegeteld, vergelijkbaar met streamobjecten.

Als IColumnsRowset::GetColumnsRowset wordt gebruikt, zullen er volgende aanroepen zijn naar IRowset::GetNextRows, IRowset::GetData en IRowset::ReleaseRows-methoden op het rowset-object van de resulterende kolom.

Nadat de OLE DB-driver voor SQL Server begint met het uitvoeren van het commando, worden de tabelwaardige parameterwaarden opgehaald uit dit tabelwaardige parameter-rowset-object en naar de server gestuurd.

Het pushmodel vereist minimale inspanning van de consument, maar gebruikt meer geheugen dan het pull-model, omdat alle tabelwaardige parametergegevens tijdens uitvoering in het geheugen moeten zijn.

Pull Model (het verkrijgen van Table-Valued parametergegevens op aanvraag van de consument)

Het pull-model is nuttig voor twee scenario's:

  • Om rijen te streamen.

  • Als een rijset van een andere provider wordt gebruikt als de tabelwaarde parameterwaarde.

In het pull-model levert de consument data on demand aan de provider. Gebruik deze aanpak als je applicatie veel data-inserties heeft, en tabelwaardige parameter-rowsetgegevens in het geheugen zouden leiden tot overmatige geheugentoegang. Als meerdere OLE DB-providers worden gebruikt, stelt het consumer pull model de consument in staat om elk rowset-object als de tabelwaardige parameterwaarde te leveren.

Om het pull-model te gebruiken, moeten consumenten hun eigen implementatie van een rowset-object leveren. Bij gebruik van het pull-model met tabelwaardige parameter-rijsets (CLSID_ROWSET_TVP), moet de consument het tabel-waarde parameter rowset-object aggregeren dat de provider blootstelt via de ITableDefinitionWithConstraints::CreateTableWithConstraints-methode of de IOpenRowset::OpenRowset-methode. Het consumerobject wordt alleen verwacht dat het de IRowset-interface-implementatie overschrijft. Je moet de volgende functies overrulen:

  • IRowset::GetNextRows

  • IRowset::AddRefRows

  • IRowset::GetData

  • IRowset::ReleaseRows

  • IRowset::HerstartPositie

OLE DB Driver voor SQL Server leest één of meer rijen tegelijk uit het consumer rowset-object om streaminggedrag in tabelwaardige parameters te ondersteunen. Bijvoorbeeld, de gebruiker kan de tabel-waarde parameter rowset-gegevens op de schijf hebben (niet in het geheugen) en de functionaliteit implementeren om gegevens van de schijf te lezen wanneer vereist door OLE DB Driver for SQL Server.

De consument communiceert zijn dataformaat aan de OLE DB Driver voor SQL Server door gebruik te maken van IAccessor::CreateAccessor op het tabel-waarde parameter rowset-object. Bij het lezen van gegevens uit de consumer buffer controleert de provider of alle beschrijfbare en niet-standaard kolommen beschikbaar zijn via ten minste één accessor-handle en gebruikt de bijbehorende handles om kolomgegevens te lezen. Om ambiguïteit te voorkomen, moet er een één-op-één correspondentie zijn tussen een tabelwaardige parameter-rijsetkolom en een binding. Dubbele bindings naar dezelfde kolom zullen een fout veroorzaken. Ook wordt van elke accessor verwacht dat het iOrdinale lid van DBBindings in volgorde is. Er zullen evenveel aanroepen naar IRowset::GetData zijn als het aantal accessors per rij, en de volgorde van aanroepen is gebaseerd op de volgorde van de iOrdinale waarde van lagere naar hogere waarden.

Van de provider wordt verwacht dat hij de meeste interfaces implementeert die door het table-valued parameter rowset-object worden blootgesteld. De consument zal een rowset-object implementeren met minimale interfaces (IRowset). Vanwege blinde aggregatie zullen de resterende verplichte rowset-objectinterfaces worden geïmplementeerd door het tabel-waarde parameter rowset-object.

Voor elk ander rowset-object, zoals rowset-objecten verkregen voor elke OLE DB-provider, moet de door de consument geleverde rowset alle verplichte rowset-objectinterfaces implementeren zoals gespecificeerd in de OLE DB-specificatie.

Op het moment van uitvoering roept de OLE DB Driver voor SQL Server het rowset-object aan om rijen op te halen en kolomgegevens te lezen.

Zie ook

Table-Valued Parameters (OLE DB)
Gebruik Table-Valued parameters (OLE DB)