Menggunakan SQLGetDiagRec dan SQLGetDiagField
Aplikasi memanggil SQLGetDiagRec atau SQLGetDiagField untuk mengambil informasi diagnostik. Fungsi-fungsi ini menerima lingkungan, koneksi, pernyataan, atau pendeskripsi menangani dan mengembalikan diagnostik dari fungsi yang terakhir digunakan handel tersebut. Diagnostik yang masuk pada handel tertentu dibuang ketika fungsi baru disebut menggunakan handel tersebut. Jika fungsi mengembalikan beberapa rekaman diagnostik, aplikasi memanggil fungsi ini beberapa kali; jumlah total rekaman status diambil dengan memanggil SQLGetDiagField untuk rekaman header (rekaman 0) dengan opsi SQL_DIAG_NUMBER.
Aplikasi mengambil bidang diagnostik individual dengan memanggil SQLGetDiagField dan menentukan bidang yang akan diambil. Bidang diagnostik tertentu tidak memiliki arti untuk jenis handel tertentu. Untuk daftar bidang diagnostik dan maknanya, lihat deskripsi fungsi SQLGetDiagField .
Aplikasi mengambil SQLSTATE, kode kesalahan asli, dan pesan diagnostik dalam satu panggilan dengan memanggil SQLGetDiagRec; SQLGetDiagRec tidak dapat digunakan untuk mengambil informasi dari rekaman header.
Misalnya, kode berikut meminta pengguna untuk pernyataan SQL dan menjalankannya. Jika ada informasi diagnostik yang dikembalikan, ia memanggil SQLGetDiagField untuk mendapatkan jumlah rekaman status dan SQLGetDiagRec untuk mendapatkan SQLSTATE, kode kesalahan asli, dan pesan diagnostik dari rekaman tersebut.
SQLCHAR SqlState[6], SQLStmt[100], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i, MsgLen;
SQLRETURN rc1, rc2;
SQLHSTMT hstmt;
// Prompt the user for an SQL statement.
GetSQLStmt(SQLStmt);
// Execute the SQL statement and return any errors or warnings.
rc1 = SQLExecDirect(hstmt, SQLStmt, SQL_NTS);
if ((rc1 == SQL_SUCCESS_WITH_INFO) || (rc1 == SQL_ERROR)) {
SQLLEN numRecs = 0;
SQLGetDiagField(SQL_HANDLE_STMT, hstmt, 0, SQL_DIAG_NUMBER, &numRecs, 0, 0);
// Get the status records.
i = 1;
while (i <= numRecs && (rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
DisplayError(SqlState,NativeError,Msg,MsgLen);
i++;
}
}
if ((rc1 == SQL_SUCCESS) || (rc1 == SQL_SUCCESS_WITH_INFO)) {
// Process statement results, if any.
}