Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Detta exempel visar SQL Server ODBC-drivrutinsspecifika alternativ för att registrera prestandastatistik. Exemplet skapar en fil: odbcperf.log. Detta exempel visar både skapandet av en prestandadataloggfil och visningen av prestandadata direkt från SQLPERF-datastrukturen (SQLPERF-strukturen definieras i Odbcss.h.). Detta prov utvecklades för ODBC version 3.0 eller senare.
Important
Använd Windows-autentisering när det är möjligt. Om Windows-autentisering inte är tillgänglig, be användarna ange sina inloggningsuppgifter vid körning. Undvik att lagra inloggningsuppgifter i en fil. Om du måste behålla inloggningsuppgifter bör du kryptera dem med Win32-krypto-API:et.
För att logga drivrutinens prestandadata med ODBC Administrator
I ovládací panel, dubbelklicka på Administrativa verktyg och sedan dubbelklicka på Data Sources (ODBC). Alternativt kan du anropa odbcad32.exe.
Klicka på flikarna Användar-DSN,System-DSN eller Fil-DSN .
Klicka på datakällan för att logga prestanda.
Klicka på Konfigurera.
I Microsoft SQL Server Configure DSN Wizard, navigera till sidan med Log ODBC-drivrutinsstatistik till loggfilen.
Välj Logga ODBC-drivrutinsstatistik i loggfilen. I rutan, placera namnet på filen där statistiken ska loggas. Eventuellt, klicka på Bläddra för att bläddra i filsystemet efter statistikloggen.
För att logga drivrutinens prestandadata programmatiskt
Anropa SQLSetConnectAttr med SQL_COPT_SS_PERF_DATA_LOG och hela sökvägen och filnamnet för prestandadataloggfilen. Ett exempel:
"C:\\Odbcperf.log"Anropa SQLSetConnectAttr med SQL_COPT_SS_PERF_DATA och SQL_PERF_START för att börja logga prestandadata.
Valfritt, anropa SQLSetConnectAttr med SQL_COPT_SS_LOG_NOW och NULL för att skriva en tabulvavgränsad post av prestandadata till prestandaloggfilen. Detta kan göras flera gånger medan applikationen körs.
Anropa SQLSetConnectAttr med SQL_COPT_SS_PERF_DATA och SQL_PERF_STOP för att sluta logga prestandadata.
För att hämta drivrutinsprestandadata i en applikation
Ring SQLSetConnectAttr med SQL_COPT_SS_PERF_DATA och SQL_PERF_START för att börja profilera prestandadata.
Anropa SQLGetConnectAttr med SQL_COPT_SS_PERF_DATA och adressen till en pekare till en SQLPERF-struktur. Det första sådana anropet sätter pekaren till adressen för en giltig SQLPERF-struktur som innehåller aktuell prestandadata. Drivrutinen uppdaterar inte kontinuerligt datan i prestandastrukturen. Applikationen måste upprepa anropet till SQLGetConnectAttr varje gång den behöver uppdatera strukturen med mer aktuell prestandadata.
Anropa SQLSetConnectAttr med SQL_COPT_SS_PERF_DATA och SQL_PERF_STOP för att sluta logga prestandadata.
Example
Du behöver en ODBC-datakälla som heter AdventureWorks, vars standarddatabas är AdventureWorks exempeldatabas. (Du kan ladda ner AdventureWorks exempeldatabas från Azure Data SQL Samples Repository GitHub-arkivet.) Denna datakälla måste baseras på ODBC-drivrutinen som tillhandahålls av operativsystemet (drivrutinsnamnet är "SQL Server"). Om du ska bygga och köra detta exempel som en 32-bitars applikation på ett 64-bitars operativsystem, måste du skapa ODBC-datakällan med ODBC-administratören i %windir%\SysWOW64\odbcad32.exe.
Detta exempel kopplas till din dators standardinstans för SQL Server. För att ansluta till en namngiven instans, ändra definitionen av ODBC-datakällan för att specificera instansen med följande format: server\namedinstance. Som standard installeras SQL Server Express i en namngiven instans.
Kompiliera med 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);
}