Verwenden von Data-at-Execution-Spalten (ODBC)

So verwenden Sie Text, nText oder Bildspalten für die Datenausführung

  1. Fügen Sie für jede Daten-bei-Ausführungsspalte spezielle Werte in die Puffer ein, die zuvor von SQLBindCol gebunden wurden:

    • Verwenden Sie für den letzten Parameter SQL_LEN_DATA_AT_EXEC(Länge), wobei die Länge die Gesamtlänge der Text-, ntext- oder Bildspaltendaten in Bytes ist.

    • Platzieren Sie für den vierten Parameter einen programmdefinierten Spaltenbezeichner.

  2. Das Aufrufen von SQLSetPos gibt SQL_NEED_DATA zurück, was angibt, dass Daten bei ausführungsspalten zur Verarbeitung bereit sind.

  3. Für jede Daten-at-Execution-Spalte:

    • Rufen Sie SQLParamData auf, um den Spaltenarrayzeiger abzurufen. Es wird SQL_NEED_DATA zurückgegeben, wenn eine andere Daten-bei-Ausführungsspalte vorhanden ist.

    • Rufen Sie SQLPutData einmal auf, um die Spaltendaten zu senden, bis die Länge gesendet wird.

  4. Rufen Sie SQLParamData auf, um anzugeben, dass alle Daten für die endgültige Daten-at-Execution-Spalte gesendet werden. Es wird keine SQL_NEED_DATA zurückgegeben.

Beispiel

Das Beispiel zeigt, wie Sie mithilfe von SQLGetData eine SQL_LONG Variablenzeichendaten lesen. Dieses Beispiel wird für IA64 nicht unterstützt.

Sie benötigen eine ODBC-Datenquelle namens AdventureWorks, deren Standarddatenbank die AdventureWorks-Beispieldatenbank ist. (Sie können die AdventureWorks-Beispieldatenbank von der Startseite für Microsoft SQL Server-Beispiele und Communityprojekte herunterladen.) Diese Datenquelle muss auf dem ODBC-Treiber basieren, der vom Betriebssystem bereitgestellt wird (der Treibername lautet "SQL Server"). Wenn Sie dieses Beispiel als 32-Bit-Anwendung auf einem 64-Bit-Betriebssystem erstellen und ausführen, müssen Sie die ODBC-Datenquelle mit dem ODBC-Administrator in %windir%\SysWOW64\odbcad32.exeerstellen.

In diesem Beispiel wird eine Verbindung mit der SQL Server-Standardinstanz Ihres Computers hergestellt. Um eine Verbindung mit einer benannten Instanz herzustellen, ändern Sie die Definition der ODBC-Datenquelle, um die Instanz mithilfe des folgenden Formats anzugeben: Server\nAmedinstance. Sql Server Express wird standardmäßig in einer benannten Instanz installiert.

Führen Sie den ersten (Transact-SQL) Codeauflistung aus, um die vom Beispiel verwendete Tabelle zu erstellen.

Kompilieren Sie den zweiten Codeeintrag (C++) mit odbc32.lib. Führen Sie dann das Programm aus.

Führen Sie den dritten (Transact-SQL) Codeauflistung aus, um die vom Beispiel verwendete Tabelle zu löschen.

use AdventureWorks  
CREATE TABLE emp3 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)  
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES   ('Name1', '12', 'This is the first employee')  
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES   ('Name2', '18', 'This is the second employee')  
// compile with: odbc32.lib  
#include <stdio.h>  
#include <string.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
#define BUFFERSIZE  450  
  
SQLHENV henv = SQL_NULL_HENV;  
SQLHDBC hdbc1 = SQL_NULL_HDBC;  
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;  
  
void Cleanup() {  
   if (hstmt1 != SQL_NULL_HSTMT)  
      SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
  
   if (hdbc1 != SQL_NULL_HDBC) {  
      SQLDisconnect(hdbc1);  
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   }  
  
   if (henv != SQL_NULL_HENV)  
      SQLFreeHandle(SQL_HANDLE_ENV, henv);  
};  
  
int main() {  
   RETCODE retcode;  
   SWORD cntr;  
  
   // SQLGetData variables.  
   UCHAR Data[BUFFERSIZE];  
   SDWORD cbBatch = (SDWORD)sizeof(Data)-1;  
   SQLLEN cbTxtSize;  
  
   // Clear data array.  
   for (cntr = 0 ; cntr < BUFFERSIZE ; cntr++)  
      Data[cntr] = 0x00;  
  
   // Allocate the ODBC environment and save handle.  
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);  
   if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(Env) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Notify ODBC that this is an ODBC 3.0 app.  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetEnvAttr(ODBC version) Failed\n\n");  
      Cleanup();  
      return(9);      
   }  
  
   // Allocate ODBC connection handle and connect.  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);  
   if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.   
   retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLConnect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Allocate statement handle; prepare, then execute command.  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLAllocHandle(hstmt1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT Memo1 FROM emp3", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Get first row.  
   retcode = SQLFetch(hstmt1);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLFetch(hstmt1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Get the SQL_LONG column.  
   cntr = 1;  
   while ( (retcode = SQLGetData(hstmt1, 1, SQL_C_CHAR, Data, cbBatch, &cbTxtSize)) != SQL_NO_DATA) {  
      printf("GetData iteration %d, pcbValue = %d,\n", cntr++, cbTxtSize);  
      printf("Data = %s\n\n", Data);  
  
      if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("GetData(hstmt1) Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }   
  
   // Clean up  
   //SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
use AdventureWorks  
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'emp3')  
     DROP TABLE emp3  
GO  

Siehe auch

Verwalten von Text- und Bildspalten -Themen (How-to-Topics, ODBC)