Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:sql Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Ten przykładowy przykład pokazuje specyficzne dla sterownika SQL Server opcje logowania długoletnich zapytań. Po uruchomieniu ten sample tworzy Odbcqry.log, który zawiera listę zapytań, których wykonanie przekracza ustalony przez aplikację przedział. Ten próbek nie jest obsługiwany przez IA64. Ten próbka została opracowana dla wersji ODBC 3.0 lub nowzej.
Ważna
Jeśli to możliwe, użyj uwierzytelniania systemu Windows. Jeśli uwierzytelnianie Windows nie jest dostępne, poprosz użytkowników o wpisanie danych uwierzytelniających w czasie działania. Unikaj przechowywania danych uwierzytelniających w plikach. Jeśli musisz utrzymywać dane uwierzytelniające, powinieneś je zaszyfrować za pomocą API kryptograficznego Win32.
Aby rejestrować długoletnie zapytania za pomocą administratora ODBC
W Panel sterowania kliknij dwukrotnie Narzędzia administracyjne, a następnie Źródła danych (ODBC). (Alternatywnie możesz uruchomić odbcad32.exe z wiersza poleceń.)
Kliknij zakładkę User DSN, System DSN lub File DSN .
Kliknij źródło danych, dla którego chcesz logować długoletnie zapytania.
Kliknij przycisk Konfiguruj.
W kreatorze konfiguracji DSN Microsoft SQL Server przejdź do strony z Zapisz długo działające zapytania do pliku logu.
Wybierz Zapisz długoletnie zapytania do pliku loga. W polu umieść nazwę pliku, w którym powinny być rejestrowane długoletnie zapytania. Opcjonalnie kliknij Przeglądaj , aby przejrzeć system plików dla dziennika zapytań.
Ustaw interwał czasu zapytania, w milisekundach, w polu Długi czas zapytania (milisekundy).
Aby programowo rejestrować długotrwale zapytania
Zadzwoń do SQLSetConnectAttr z SQL_COPT_SS_PERF_QUERY_LOG oraz pełną ścieżką i nazwą pliku długo działającego dziennika zapytań. Przykład:
C:\\Odbcqry.logZadzwoń do SQLSetConnectAttr z SQL_COPT_SS_PERF_QUERY_INTERVAL i ustaw interwał czasowy na milisekundy.
Zadzwoń do SQLSetConnectAttr z SQL_COPT_SS_PERF_QUERY i SQL_PERF_START, aby zacząć rejestrować długo działające zapytania.
Zadzwoń do SQLSetConnectAttr z SQL_COPT_SS_PERF_QUERY i SQL_PERF_STOP, aby przestać logować długoletnie zapytania.
Example
Będziesz potrzebować źródła danych ODBC o nazwie AdventureWorks, którego domyślną bazą danych jest przykładowa baza danych AdventureWorks. (Możesz pobrać przykładową bazę danych AdventureWorks z repozytorium Azure Data SQL Samples Repository GitHub.) To źródło danych musi opierać się na sterowniku ODBC dostarczonym przez system operacyjny (nazwa sterownika to "SQL Server"). Jeśli chcesz zbudować i uruchomić ten przykład jako aplikację 32-bitową na 64-bitowym systemie operacyjnym, musisz utworzyć źródło danych ODBC za pomocą administratora ODBC w %windir%\SysWOW64\odbcad32.exe.
Ten przykład łączy się z domyślną instancją SQL Server na Twoim komputerze. Aby połączyć się z nazwaną instancją, zmień definicję źródła danych ODBC, aby określić instancję w następującym formacie: serwer\namedinstance. Domyślnie SQL Server Express instaluje się na nazwanej instancji.
Kompiluj za pomocą 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);
}