Данные о производительности драйвера профиля (ODBC)

В этом примере показаны параметры драйвера ODBC SQL Server для записи статистики производительности. Пример создает один файл: odbcperf.log.В этом примере показано создание файла журнала данных производительности и отображение данных производительности непосредственно из структуры данных SQLPERF (структура SQLPERF определена в Odbcss.h.). Этот пример был разработан для ODBC версии 3.0 или более поздней.

Это важно

По возможности используйте проверку подлинности Windows. Если проверка подлинности Windows недоступна, предложите пользователям ввести свои учетные данные во время выполнения. Избегайте хранения учетных данных в файле. Если необходимо сохранить учетные данные, их следует зашифровать с помощью API шифрования Win32.

Ведение журнала данных о производительности драйвера с помощью администратора ODBC

  1. На панели управления дважды щелкните "Администрирование" и дважды щелкните источники данных (ODBC). Кроме того, можно вызвать odbcad32.exe.

  2. Перейдите на вкладку "Доменная запись пользователя", "Системная dsN" или " Файл dsN ".

  3. Щелкните источник данных, для которого нужно записать производительность.

  4. Нажмите Настроить.

  5. В мастере настройки DSN Microsoft SQL Server перейдите на страницу со статистикой драйвера ODBC журнала в файл журнала.

  6. Выберите статистику драйвера ODBC журнала в файл журнала. В поле поместите имя файла, в котором должна быть записана статистика. При необходимости нажмите кнопку "Обзор ", чтобы просмотреть файловую систему для журнала статистики.

Ведение журнала данных о производительности драйвера программным способом

  1. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_DATA_LOG и полным путем и именем файла журнала данных производительности. Рассмотрим пример.

    "C:\\Odbcperf.log"  
    
  2. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_DATA и SQL_PERF_START, чтобы начать ведение журнала данных о производительности.

  3. При необходимости вызовите SQLSetConnectAttr с SQL_COPT_SS_LOG_NOW и NULL для записи записи данных производительности с разделителями табуляции в файл журнала данных производительности. Это можно сделать несколько раз при запуске приложения.

  4. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_DATA и SQL_PERF_STOP, чтобы остановить ведение журнала данных о производительности.

Извлечение данных о производительности драйвера в приложение

  1. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_DATA и SQL_PERF_START, чтобы начать профилирование данных о производительности.

  2. Вызовите SQLGetConnectAttr с SQL_COPT_SS_PERF_DATA и адресом указателя на структуру SQLPERF. Первый такой вызов задает указатель на адрес допустимой структуры SQLPERF, содержащей текущие данные о производительности. Драйвер не постоянно обновляет данные в структуре производительности. Приложение должно повторить вызов SQLGetConnectAttr в любое время, когда необходимо обновить структуру с более текущими данными о производительности.

  3. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_DATA и SQL_PERF_STOP, чтобы остановить ведение журнала данных о производительности.

Пример

Вам потребуется источник данных ODBC с именем AdventureWorks, база данных по умолчанию которой является примером базы данных AdventureWorks. (Пример базы данных AdventureWorks можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server .) Этот источник данных должен основываться на драйвере ODBC, предоставленном операционной системой (имя драйвера — SQL Server). Если вы создадите и запустите этот пример как 32-разрядное приложение в 64-разрядной операционной системе, необходимо создать источник данных ODBC с администратором ODBC в %windir%\SysWOW64\odbcad32.exe.

Этот пример подключается к экземпляру SQL Server по умолчанию компьютера. Чтобы подключиться к именованным экземплярам, измените определение источника данных ODBC, чтобы указать экземпляр с помощью следующего формата: сервер\namedstance. По умолчанию SQL Server Express устанавливает в именованный экземпляр.

Скомпилируйте с помощью odbc32.lib.

// compile with: odbc32.lib  
#include <stdio.h>  
#include <string.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
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;  
  
   // Pointer to the ODBC driver performance structure.  
   SQLPERF *PerfPtr;  
   SQLINTEGER cbPerfPtr;  
  
   // 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);  
   }  
  
   // This sample use Integrated Security. Please create the SQL Server   
   // DSN by using the 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);  
   }  
  
   // Set options to log performance statistics.  Specify file to use for the log.  
   retcode = SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG, &"odbcperf.log", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Start the performance statistics log.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)SQL_PERF_START, SQL_IS_UINTEGER);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Allocate statement handle, then execute command.  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLAllocHandle() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Purchasing.Vendor", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Sales.Store", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   // Generate a long-running query.  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"waitfor delay '00:00:04' ", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   // Write current statistics to the performance log.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG_NOW, (SQLPOINTER)NULL, SQL_IS_UINTEGER);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Get pointer to current SQLPerf structure.  
   // Print a couple of statistics.  
   retcode =   
      SQLGetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)&PerfPtr, SQL_IS_POINTER, &cbPerfPtr);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLGetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   printf("SQLSelects = %d, SQLSelectRows = %d\n", PerfPtr->SQLSelects, PerfPtr->SQLSelectRows);  
  
   // Cleanup  
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  

См. также

Инструкции по профилированию драйвера ODBC (ODBC)
Производительность драйвера ODBC для профилирования