Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Dit voorbeeld toont de SQL Server ODBC-driverspecifieke opties om prestatiestatistieken vast te leggen. Het voorbeeld maakt één bestand aan: odbcperf.log. Dit voorbeeld toont zowel het aanmaken van een prestatiedatalogbestand als het tonen van prestatiegegevens direct vanuit de SQLPERF-datastructuur (de SQLPERF-structuur is gedefinieerd in Odbcss.h.). Deze sample is ontwikkeld voor ODBC versie 3.0 of later.
Important
Gebruik waar mogelijk Windows-verificatie. Als Windows-authenticatie niet beschikbaar is, vraag gebruikers dan om hun inloggegevens tijdens runtime in te voeren. Vermijd het opslaan van inloggegevens in een bestand. Als je inloggegevens moet behouden, moet je ze versleutelen met de Win32 crypto API.
Om driverprestatiegegevens te loggen met ODBC Administrator
In het Configuratiescherm dubbelklikt u op Administratieve Tools en vervolgens dubbel op Data Sources (ODBC). Alternatief kun je odbcad32.exeaanroepen.
Klik op het tabblad Gebruiker DSN,Systeem DSN of Bestand DSN .
Klik op de databron waarvoor je prestaties wilt loggen.
Klik op configureren.
In de Microsoft SQL Server Configure DSN Wizard navigeer je naar de pagina met Log ODBC driverstatistieken naar het logbestand.
Selecteer ODBC-driverstatistieken loggen in het logbestand. In het vakje plaats je de naam van het bestand waar de statistieken moeten worden geregistreerd. Klik optioneel op Bladeren om het bestandssysteem voor het statistieklogboek te bekijken.
Om programmatisch driverprestatiegegevens te loggen
Roep SQLSetConnectAttr aan met SQL_COPT_SS_PERF_DATA_LOG en het volledige pad en de bestandsnaam van het performance data-logbestand. Voorbeeld:
"C:\\Odbcperf.log"Bel SQLSetConnectAttr met SQL_COPT_SS_PERF_DATA en SQL_PERF_START om te beginnen met het loggen van prestatiegegevens.
Optioneel kunt u SQLSetConnectAttr aanroepen met SQL_COPT_SS_LOG_NOW en NULL om een tab-gescheiden record van prestatiegegevens naar het prestatielogbestand te schrijven. Dit kan meerdere keren worden gedaan terwijl de applicatie draait.
Bel SQLSetConnectAttr met SQL_COPT_SS_PERF_DATA en SQL_PERF_STOP om het loggen van prestatiegegevens te stoppen.
Om driverprestatiegegevens in een applicatie te halen
Bel SQLSetConnectAttr met SQL_COPT_SS_PERF_DATA en SQL_PERF_START om te beginnen met het profileren van prestatiegegevens.
Roep SQLGetConnectAttr aan met SQL_COPT_SS_PERF_DATA en het adres van een pointer naar een SQLPERF-structuur. De eerste dergelijke aanroep stelt de pointer in op het adres van een geldige SQLPERF-structuur die actuele prestatiegegevens bevat. De driver ververst de gegevens in de prestatiestructuur niet continu. De applicatie moet de aanroep naar SQLGetConnectAttr herhalen telkens wanneer de structuur moet worden bijgewerkt met actuelere prestatiegegevens.
Bel SQLSetConnectAttr met SQL_COPT_SS_PERF_DATA en SQL_PERF_STOP om het loggen van prestatiegegevens te stoppen.
Example
Je hebt een ODBC-databron nodig genaamd AdventureWorks, waarvan de standaarddatabase de voorbeelddatabase van AdventureWorks is. (Je kunt de AdventureWorks-voorbeelddatabase downloaden uit de Azure Data SQL Samples Repository GitHub-repository.) Deze databron moet gebaseerd zijn op de ODBC-driver die door het besturingssysteem wordt geleverd (de drivernaam is "SQL Server"). Als je dit voorbeeld als een 32-bits applicatie op een 64-bit besturingssysteem wilt bouwen en uitvoeren, moet je de ODBC-databron aanmaken met de ODBC Administrator in %windir%\SysWOW64\odbcad32.exe.
Dit voorbeeld maakt verbinding met de standaard SQL Server-instantie van je computer. Om verbinding te maken met een benoemde instantie, wijzig je de definitie van de ODBC-databron om de instantie te specificeren met het volgende formaat: server\namedinstance. Standaard wordt SQL Server Express geïnstalleerd op een benoemde instantie.
Compileer met 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);
}