Журнал запросов Long-Running (ODBC)

В этом примере показаны параметры драйвера ODBC ДЛЯ SQL Server для журналов длительных запросов. При выполнении этот пример создает Odbcqry.log, содержащий список запросов, выполнение которых превышает интервал, заданный приложением. Этот пример не поддерживается в IA64. Этот пример был разработан для ODBC версии 3.0 или более поздней.

Это важно

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

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

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

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

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

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

  5. В мастере настройки DSN Microsoft SQL Server перейдите на страницу с помощью команды "Сохранить длительные запросы" в файл журнала.

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

  7. Задайте интервал времени ожидания запроса в миллисекундах в поле "Долгое время запроса" (миллисекундах).

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

  1. ВызовИТЕ SQLSetConnectAttr с SQL_COPT_SS_PERF_QUERY_LOG и полным путем и именем файла журнала запросов. Рассмотрим пример.

    C:\\Odbcqry.log  
    
  2. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_QUERY_INTERVAL и задайте интервал времени ожидания в миллисекундах.

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

  4. Вызовите SQLSetConnectAttr с SQL_COPT_SS_PERF_QUERY и 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;  
  
   // 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 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 long-running queries, including the file to use for the log.  
   retcode = SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_QUERY_LOG, &"odbcqry.log", SQL_NTS);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Set the long-running query interval (in milliseconds).  Note that for version 2.50 and 2.65  
   // drivers, this value is specified in seconds, not milliseconds.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_QUERY_INTERVAL, (SQLPOINTER)3000, SQL_IS_UINTEGER);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Start the long-running query log.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_QUERY, (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 commands.  
   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 * 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);  
      }  
   }  
  
   // Cleanup  
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  

См. также

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