Envoi de données comme paramètre table avec toutes les valeurs en mémoire (ODBC)

Cette rubrique décrit comment envoyer des données à une procédure stockée comme paramètre table lorsque toutes les valeurs sont en mémoire. Pour obtenir un autre exemple illustrant des paramètres table, consultez Utiliser des paramètres table (ODBC).

Composant requis

Cette procédure suppose que la commande Transact-SQL suivante a été exécutée sur le serveur :

create type TVParam as table(ProdCode integer, Qty integer)
create procedure TVPOrderEntry(@CustCode varchar(5), @Items TVPParam, 
            @OrdNo integer output, @OrdDate datetime output)
         as 
         set @OrdDate = GETDATE();
         insert into TVPOrd (OrdDate, CustCode) 
values (@OrdDate, @CustCode) output OrdNo); 
         select @OrdNo = SCOPE_IDENTITY(); 
         insert into TVPItem (OrdNo, ProdCode, Qty)
select @OrdNo, @Items.ProdCode, @Items.Qty 
from @Items

Pour envoyer les données

  1. Déclarez les variables des paramètres SQL. Dans ce cas, comme la valeur de table est contenue intégralement en mémoire, les valeurs des colonnes de la valeur de table sont déclarées comme tableaux.

    SQLRETURN r;
    // Variables for SQL parameters.
    #define ITEM_ARRAY_SIZE 20
    
    SQLCHAR CustCode[6];
    SQLCHAR *TVP = (SQLCHAR *) "TVParam";
    SQLINTEGER ProdCode[ITEM_ARRAY_SIZE], Qty[ITEM_ARRAY_SIZE];
    SQLINTEGER OrdNo;
    char OrdDate[23];
    
    // Variables for indicator/length variables associated with parameters.
    SQLLEN cbCustCode, cbTVP, cbProdCode[ITEM_ARRAY_SIZE], cbQty[ITEM_ARRAY_SIZE], cbOrdNo, cbOrdDate;
    
  2. Liez les paramètres. La liaison de paramètres se décompose en deux étapes lorsque les paramètres table sont utilisés. Dans la première étape, les paramètres de la procédure stockée sont liés de façon normale, comme suit.

    // Bind parameters for call to TVPOrderEntryDirect.
    // 1 - Custcode input
    r = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,SQL_VARCHAR, SQL_C_CHAR, 5, 0, CustCode, sizeof(CustCode), &cbCustCode);
    
    // 2 - Items TVP
    r = SQLBindParameter(hstmt, 
        2,// ParameterNumber
        SQL_PARAM_INPUT,// InputOutputType
        SQL_C_DEFAULT,// ValueType 
        SQL_SS_TABLE,// Parametertype
        ITEM_ARRAY_SIZE,// ColumnSize: For a table-valued parameter this is the row array size.
        0,// DecimalDigits: For a table-valued parameter this is always 0. 
        TVP,// ParameterValuePtr: For a table-valued parameter this is the type name of the 
    //table-valued parameter, and also a token returned by SQLParamData.
        SQL_NTS,// BufferLength: For a table-valued parameter this is the length of the type name or SQL_NTS.
        &cbTVP);// StrLen_or_IndPtr: For a table-valued parameter this is the number of rows actually used.
    
    // 3 - OrdNo output
    r = SQLBindParameter(hstmt, 3, SQL_PARAM_OUTPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, &OrdNo,
       sizeof(SQLINTEGER), &cbOrdNo);
    // 4 - OrdDate output
    r = SQLBindParameter(hstmt, 4, SQL_PARAM_OUTPUT,SQL_TYPE_TIMESTAMP, SQL_C_CHAR, 23, 3, &OrdDate, 
       sizeof(OrdDate), &cbOrdDate);
    
  3. La deuxième étape consiste à lier les colonnes pour le paramètre table. Le focus de paramètre est d'abord défini sur la position ordinale du paramètre table. Puis, les colonnes de la valeur de table sont liées à l'aide de SQLBindParameter, comme elles le seraient si elles étaient des paramètres de la procédure stockée, mais avec les positions ordinales des colonnes pour ParameterNumber. S'il y avait plus de paramètres table, nous définirions le focus sur chacun d'eux à tour de rôle et lierions leurs colonnes. Enfin, le focus de paramètre est réinitialisé à la valeur 0.

    // Bind columns for the table-valued parameter (param 2).
    // First set focus on param 2.
    r = SQLSetStmtAttr(hstmt, SQL_SOPT_SS_PARAM_FOCUS, (SQLPOINTER) 2, SQL_IS_INTEGER);
    
    // Col 1 - ProdCode
    r = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, ProdCode, sizeof(SQLINTEGER), cbProdCode);
    // Col 2 - Qty
    r = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, Qty, sizeof(SQLINTEGER), cbQty);
    
    // Reset param focus.
    r = SQLSetStmtAttr(hstmt, SQL_SOPT_SS_PARAM_FOCUS, (SQLPOINTER) 0, SQL_IS_INTEGER);
    
  4. Remplissez les mémoires tampons de paramètres. cbTVP est défini avec le nombre de lignes à envoyer au serveur.

    // Populate parameters.
    cbTVP = 0; // Number of rows available for input.
    strcpy_s((char *) CustCode, sizeof(CustCode), "CUST1"); cbCustCode = SQL_NTS;
    
    ProdCode[cbTVP] = 1215;cbProdCode[cbTVP] = sizeof(SQLINTEGER); 
    Qty[cbTVP] = 5;cbQty[cbTVP] = sizeof(SQLINTEGER); 
    cbTVP++; // Number of rows available for input
    
    ProdCode[cbTVP] = 1017;cbProdCode[cbTVP] = sizeof(SQLINTEGER); 
    Qty[cbTVP] = 2;cbQty[cbTVP] = sizeof(SQLINTEGER); 
    cbTVP++; // Number of rows available for input.
    
  5. Appelez la procédure :

    // Call the procedure.
    r = SQLExecDirect(hstmt, (SQLCHAR *) "{call TVPOrderEntry(?, ?, ?, ?)}",SQL_NTS);
    

Voir aussi

Concepts

Exemples de programmation de paramètres table ODBC