Definindo o perfil de dados de desempenho do driver ODBC

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse Analytics

Este exemplo mostra as opções específicas do driver ODBC do SQL Server para registar estatísticas de desempenho. O exemplo cria um ficheiro: odbcperf.log. Este exemplo mostra tanto a criação de um ficheiro de registo de dados de desempenho como a apresentação dos dados de desempenho diretamente da estrutura SQLPERF (A estrutura SQLPERF está definida em Odbcss.h.). Este exemplo foi desenvolvido para a versão 3.0 do ODBC ou posterior.

Importante

Quando possível, use a Autenticação do Windows. Se a Autenticação Windows não estiver disponível, peça aos utilizadores para introduzirem as suas credenciais em tempo de execução. Evite guardar credenciais num ficheiro. Se tiver de manter credenciais, deve encriptá-las com a API criptográfica Win32.

Para registar dados de desempenho do driver usando o ODBC Administrator

  1. No Painel de Controlo, clique duas vezes em Ferramentas Administrativas e depois em Fontes de Dados (ODBC). Alternativamente, pode invocar odbcad32.exe.

  2. Clique no separador DSN do Utilizador, DSN do Sistema ou DSN do Ficheiro .

  3. Clique na fonte de dados para registar o desempenho.

  4. Clique em Configurar.

  5. No Microsoft SQL Server Configure DSN Wizard, navegue até à página com as estatísticas do driver ODBC para o ficheiro de log.

  6. Selecione Registar as estatísticas do driver ODBC no ficheiro de log. Na caixa, coloque o nome do ficheiro onde as estatísticas devem ser registadas. Opcionalmente, clique em Explorar para navegar pelo sistema de ficheiros do registo de estatísticas.

Para registar programaticamente os dados de desempenho dos drivers

  1. Chame SQLSetConnectAttr com SQL_COPT_SS_PERF_DATA_LOG e o caminho completo e nome do ficheiro do registo de dados de desempenho. Por exemplo:

    "C:\\Odbcperf.log"  
    
  2. Ligue para o SQLSetConnectAttr com SQL_COPT_SS_PERF_DATA e SQL_PERF_START para começar a registar dados de desempenho.

  3. Opcionalmente, chame SQLSetConnectAttr com SQL_COPT_SS_LOG_NOW e NULL para escrever um registo delimitado por tabulação dos dados de desempenho no ficheiro de registo de dados de desempenho. Isto pode ser feito várias vezes durante a execução da aplicação.

  4. Ligue ao SQLSetConnectAttr com SQL_COPT_SS_PERF_DATA e SQL_PERF_STOP para parar de registar dados de desempenho.

Para extrair dados de desempenho do driver para uma aplicação

  1. Ligue ao SQLSetConnectAttr com SQL_COPT_SS_PERF_DATA e SQL_PERF_START para começar a analisar os dados de desempenho.

  2. Chame SQLGetConnectAttr com SQL_COPT_SS_PERF_DATA e o endereço de um ponteiro para uma estrutura SQLPERF. A primeira chamada deste tipo define o ponteiro para o endereço de uma estrutura SQLPERF válida que contém dados de desempenho atuais. O driver não atualiza continuamente os dados na estrutura de desempenho. A aplicação deve repetir a chamada para SQLGetConnectAttr sempre que precisar de atualizar a estrutura com dados de desempenho mais atuais.

  3. Ligue ao SQLSetConnectAttr com SQL_COPT_SS_PERF_DATA e SQL_PERF_STOP para parar de registar dados de desempenho.

Example

Vai precisar de uma fonte de dados ODBC chamada AdventureWorks, cuja base de dados padrão é a base de dados de exemplos AdventureWorks. (Pode descarregar a base de dados de exemplos AdventureWorks a partir do repositório GitHub do Azure Data SQL Samples Repository.) Esta fonte de dados deve basear-se no driver ODBC fornecido pelo sistema operativo (o nome do driver é "SQL Server"). Se for construir e executar este exemplo como uma aplicação de 32 bits num sistema operativo de 64 bits, deve criar a fonte de dados ODBC com o ODBC Administrator em %windir%\SysWOW64\odbcad32.exe.

Este exemplo liga-se à instância padrão do SQL Server do seu computador. Para se ligar a uma instância nomeada, altere a definição da fonte de dados ODBC para especificar a instância usando o seguinte formato: server\namedinstance. Por defeito, o SQL Server Express instala-se numa instância nomeada.

Compilar com 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);  
}