Condividi tramite


Inserimento di dati in parametri Table-Valued

Il provider OLE DB di SQL Server Native Client supporta due modelli per il consumer per specificare i dati per le righe dei parametri con valori di tabella: un modello push e un modello pull. È disponibile un esempio che illustra il modello di pull; vedere Esempi di programmazione dati di SQL Server.

Annotazioni

Una colonna di parametri con valori di tabella deve avere valori non predefiniti in tutte le righe o valori predefiniti in tutte le righe. Non è possibile avere valori predefiniti in alcune righe, ma non in altri. Pertanto, nelle associazioni di parametri con valori di tabella, gli unici valori di stato consentiti per i dati della colonna del set di righe dei parametri con valori di tabella sono DBSTATUS_S_ISNULL e DBSTATUS_S_OK. DBSTATUS_S_DEFAULT genererà un errore e il valore dello stato associato verrà impostato su DBSTATUS_E_BADSTATUS.

Modello push (carica tutti i dati Table-Valued Paremeter in memoria)

Il modello push è simile all'uso dei set di parametri, ovvero il parametro DBPARAMS in ICommand::Execute. Il modello push viene usato solo se gli oggetti set di righe dei parametri con valori di tabella vengono usati senza un'implementazione personalizzata delle interfacce IRowset. Il modello push è consigliato quando il numero di righe nel set di righe di parametri con valori di tabella è ridotto e non è previsto che un utilizzo eccessivo della memoria sull'applicazione. Questa operazione è più semplice rispetto al modello pull, perché non richiede altre funzionalità dall'applicazione consumer rispetto a quella attualmente comune nelle applicazioni OLE DB tipiche.

È previsto che il consumer fornisca tutti i dati dei parametri con valori di tabella al provider prima di eseguire un comando. Per fornire i dati, il consumer popola un oggetto set di righe di parametri con valori di tabella per ogni parametro con valori di tabella. L'oggetto set di righe di parametri con valori di tabella espone le operazioni Insert, Set e Delete del set di righe, che il consumer userà per modificare i dati dei parametri con valori di tabella. Il provider recupererà i dati da questo oggetto set di righe di parametri con valori di tabella in fase di esecuzione.

Quando al consumer viene fornito un oggetto set di righe di parametri con valori di tabella, il consumer può elaborarlo come oggetto set di righe. Il consumer può ottenere le informazioni sul tipo di ogni colonna (tipo, lunghezza massima, precisione e scala) usando il metodo di interfaccia IColumnsInfo::GetColumnInfo o IColumnsRowset::GetColumnsRowset. Il consumer crea quindi una funzione di accesso per specificare le associazioni per i dati. Il passaggio successivo consiste nell'inserire righe di dati nel set di righe di parametri con valori di tabella. A tale scopo, è possibile usare IRowsetChange::InsertRow. IRowsetChange::SetData o IRowsetChange::D eleteRows possono essere usati anche nell'oggetto set di righe del parametro con valori di tabella se è necessario modificare i dati. Gli oggetti set di righe con parametri con valori di tabella vengono conteggiati, in modo analogo agli oggetti flusso.

Se viene utilizzato IColumnsRowset::GetColumnsRowset, verranno eseguite chiamate successive ai metodi IRowset::GetNextRows, IRowset::GetData e IRowset::ReleaseRows nell'oggetto set di righe della colonna risultante.

Dopo che il provider OLE DB di SQL Server Native Client inizia a eseguire il comando, i valori dei parametri con valori di tabella verranno recuperati da questo oggetto set di righe di parametri con valori di tabella e inviati al server.

Il modello push richiede un lavoro minimo da parte del consumer, ma usa più memoria del modello pull, perché tutti i dati dei parametri con valori di tabella devono essere in memoria in fase di esecuzione.

Modello pull (recupero dei dati dei parametri Table-Valued su richiesta dal consumer)

Il modello pull è utile per due scenari:

  • Per trasmettere le righe.

  • Se un set di righe di un altro provider viene usato come valore del parametro con valori di tabella.

Nel modello di pull il consumer fornisce dati su richiesta al provider. Usare questo approccio se l'applicazione ha molti inserimenti di dati e i dati del set di righe con valori di tabella in memoria comportano un accesso eccessivo alla memoria. Se vengono utilizzati più provider OLE DB, il modello di pull consumer consente al consumer di fornire qualsiasi oggetto set di righe come valore del parametro con valori di tabella.

Per usare il modello pull, i consumer devono fornire la propria implementazione di un oggetto set di righe. Quando si usa il modello pull con set di righe di parametri con valori di tabella (CLSID_ROWSET_TVP), il consumer deve aggregare l'oggetto set di righe del parametro con valori di tabella esposto dal provider tramite il metodo ITableDefinitionWithConstraints::CreateTableWithConstraints o il metodo IOpenRowset::OpenRowset. L'oggetto consumer deve eseguire l'override solo dell'implementazione dell'interfaccia IRowset. È necessario eseguire l'override delle funzioni seguenti:

  • IRowset::GetNextRows

  • IRowset::AddRefRows

  • IRowset::GetData

  • IRowset::ReleaseRows

  • IRowset::RestartPosition

Il provider OLE DB di SQL Server Native Client leggerà una o più righe alla volta dall'oggetto set di righe consumer per supportare il comportamento di streaming nei parametri con valori di tabella. Ad esempio, l'utente potrebbe avere i dati del set di righe del parametro con valori di tabella su disco (non in memoria) e potrebbe implementare la funzionalità per leggere i dati dal disco quando richiesto dal provider OLE DB di SQL Server Native Client.

Il consumer comunicherà il formato di dati al provider OLE DB di SQL Server Native Client usando IAccessor::CreateAccessor nell'oggetto set di righe del parametro con valori di tabella. Durante la lettura dei dati dal buffer consumer, il provider verifica che tutte le colonne scrivibili e non predefinite siano disponibili tramite almeno un handle di funzione di accesso e usi gli handle corrispondenti per leggere i dati delle colonne. Per evitare ambiguità, deve essere presente una corrispondenza uno-a-uno tra una colonna del set di righe di parametri con valori di tabella e un'associazione. Le associazioni duplicate alla stessa colonna genereranno un errore. Inoltre, ogni funzione di accesso dovrebbe avere il membro iOrdinal di DBBindings in sequenza. Verranno eseguite tutte le chiamate a IRowset::GetData come numero di funzioni di accesso per riga e l'ordine delle chiamate sarà basato sull'ordine dei valori iOrdinal da valori inferiori a superiori.

È previsto che il provider implementi la maggior parte delle interfacce esposte dall'oggetto set di righe dei parametri con valori di tabella. Il consumer implementerà un oggetto set di righe con interfacce minime (IRowset). A causa dell'aggregazione non cieco, le interfacce degli oggetti set di righe obbligatorie rimanenti verranno implementate dall'oggetto set di righe del parametro con valori di tabella.

Per qualsiasi altro oggetto set di righe, ad esempio gli oggetti set di righe ottenuti per qualsiasi provider OLE DB, il set di righe fornito dal consumer deve implementare tutte le interfacce di oggetto set di righe obbligatorie come specificato nella specifica OLE DB.

Al momento dell'esecuzione, il provider OLE DB di SQL Server Native Client richiama l'oggetto set di righe per recuperare righe e leggere i dati delle colonne.

Vedere anche

ParametriTable-Valued (OLE DB)
Usare parametri con valori di tabella (OLE DB)