Aracılığıyla paylaş


İşlem odbc hataları (odbc)

İki odbc işlev çağrıları, odbc ileti almak için kullanılabilir: SQLGetDiagRec ve SQLGetDiagField. Birincil odbc ile ilgili bilgi edinmek için SQLState, pfNative, ve ErrorMessage Tanı alanlar, çağrı SQLGetDiagRec sql_no_data dönene kadar. Her bir tanılama kayıt için SQLGetDiagFieldtek tek alanları almak için çağrılabilir. Tüm sürücü özel alanları kullanarak alınması SQLGetDiagField.

SQLGetDiagRec ve SQLGetDiagFieldodbc Sürücü Yöneticisi, tek bir sürücü tarafından işlenir. Başarılı bir bağlantı yapılmış kadar odbc sürücü yöneticisi sürücüye özgü tanı alanlar önbelleğe almaz. Arayan SQLGetDiagFieldsürücüye özgü tanı alanlar için önce başarılı bir bağlantı mümkün değil. Onlar SQL_SUCCESS_WITH_INFO dönüş bile bu odbc bağlantı komutları içerir. Sonraki odbc işlevini çağırmak kadar sürücüye özgü tanı alanlar kullanılabilir olmayacaktır.

Örnek

Açıklama

Bu örnek bir basit hata işleyicisi bu aramaları gösterir SQLGetDiagRec standart odbc bilgi. Daha sonra bir geçerli bağlantı için sınar ve varsa, aramaları SQLGetDiagFieldiçin SQL Serverodbc sürücüsü özgü tanı alanlar. Bu örnek IA64 üzerinde desteklenmiyor.

Bu örnek, odbc sürüm 3.0 veya daha sonrası için geliştirilmiştir.

Güvenlik notuGüvenlik Notu

Mümkünse Windows Kimlik Doğrulaması kullanın. Windows kimlik doğrulaması kimlik bilgilerini zamanında kullanılabilir, istem girmelerini değilse. Kimlik bilgileri bir dosyada saklamak kaçının. Kimlik ederse gerekir, onlarla şifrelemek Win32 şifreleme API.

AdventureWorks örnek veritabanı olan varsayılan veritabanıdır, adlı bir odbc veri kaynağı gerekir. (Sen-ebilmek download AdventureWorks örnek veritabanı Microsoft SQL Server örnekleri ve topluluk projeler Ana sayfa.) Bu veri kaynağı odbc sürücüsünün ("SQL Server" sürücü adıdır) işletim sistemi tarafından sağlanan temel gerekir. Eğer kurmak ve bu örnek 32 bitlik bir uygulama bir 64-bit işletim sisteminde çalışan, odbc Yöneticisi'nde % windir%\SysWOW64\odbcad32.exe ile odbc veri kaynağı oluşturmanız gerekir.

Bu örnek için bilgisayarınızın varsayılan bağlar SQL Serverörneği. Adlandırılmış bir örneğine bağlanmak için aşağıdaki biçimi kullanarak belirtmek için odbc veri kaynağı tanımını değiştirin: server\namedinstance. Varsayılan olarak, SQL Server Expressadlandırılmış bir örneğine yüklenir.

İlk çalıştırma (Transact-SQL) bu örneği tarafından kullanılan bir saklı yordam oluşturmak için liste kodu.

Odbc32.lib ile listeleme ikinci (c++) kodu derleyin. Sonra programı çalıştırın.

Üçüncü yürütme (Transact-SQL) bu örneği tarafından kullanılan bir saklı yordam silmek için liste kodu.

Kodu

use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BadOne')
   DROP PROCEDURE BadOne

Go

CREATE PROCEDURE BadOne 
AS 
SELECT * FROM Purchasing.Vendor
Go

use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BadOne')
   DROP PROCEDURE BadOne

Go

CREATE PROCEDURE BadOne 
AS 
SELECT * FROM Purchasing.Vendor
Go

Kodu

// compile with: odbc32.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

#define MAXBUFLEN 256

SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;     
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;

void ProcessLogMessages(SQLSMALLINT plm_handle_type, SQLHANDLE plm_handle, char *logstring, int ConnInd);

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

   // 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) ) {
         ProcessLogMessages(SQL_HANDLE_DBC, hdbc1, "SQLConnect() Failed\n\n", FALSE);
         Cleanup();
         return(9);
   }
   else {
      ProcessLogMessages(SQL_HANDLE_DBC, hdbc1,
         "\nConnect Successful\n\n", FALSE);
   }

   // Allocate statement handle, and then execute command.
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
      ProcessLogMessages(SQL_HANDLE_DBC, hdbc1, "SQLAllocHandle(hstmt1) Failed\n\n", TRUE);
      Cleanup();
      return(9);
   }

   retcode = SQLExecDirect(hstmt1, (UCHAR*)"exec BadOne", SQL_NTS);
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
         ProcessLogMessages(SQL_HANDLE_STMT, hstmt1, "SQLExecute() Failed\n\n", TRUE);
         Cleanup();
         return(9);
   }

   // Clear any result sets generated.
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA )
      ;

   // Clean up. 
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

void ProcessLogMessages(SQLSMALLINT plm_handle_type, SQLHANDLE plm_handle, char *logstring, int ConnInd) {
   RETCODE plm_retcode = SQL_SUCCESS;
   UCHAR plm_szSqlState[MAXBUFLEN] = "", plm_szErrorMsg[MAXBUFLEN] = "";
   SDWORD plm_pfNativeError = 0L;
   SWORD plm_pcbErrorMsg = 0;
   SQLSMALLINT plm_cRecNmbr = 1;
   SDWORD plm_SS_MsgState = 0, plm_SS_Severity = 0;
   SQLINTEGER plm_Rownumber = 0;
   USHORT plm_SS_Line;
   SQLSMALLINT plm_cbSS_Procname, plm_cbSS_Srvname;
   SQLCHAR plm_SS_Procname[MAXNAME], plm_SS_Srvname[MAXNAME];

   if (logstring)
      printf(logstring);

   while (plm_retcode != SQL_NO_DATA_FOUND) {
      plm_retcode = SQLGetDiagRec(plm_handle_type, plm_handle, plm_cRecNmbr, 
                                  plm_szSqlState, &plm_pfNativeError, plm_szErrorMsg, 
                                  MAXBUFLEN - 1, &plm_pcbErrorMsg);

      // Note that if the application has not yet made a successful connection, 
      // the SQLGetDiagField information has not yet been cached by ODBC Driver Manager and 
      // these calls to SQLGetDiagField will fail.
      if (plm_retcode != SQL_NO_DATA_FOUND) {
         if (ConnInd) { 
            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                                        SQL_DIAG_ROW_NUMBER, &plm_Rownumber,
                                                        SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_LINE, &plm_SS_Line, SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr, 
                                           SQL_DIAG_SS_MSGSTATE, &plm_SS_MsgState,
                                           SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_SEVERITY, &plm_SS_Severity,
                                           SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_PROCNAME, &plm_SS_Procname,
                                           sizeof(plm_SS_Procname), &plm_cbSS_Procname);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_SRVNAME, &plm_SS_Srvname, 
                                           sizeof(plm_SS_Srvname), &plm_cbSS_Srvname);
         }

         printf("szSqlState = %s\n", plm_szSqlState);
         printf("pfNativeError = %d\n", plm_pfNativeError);
         printf("szErrorMsg = %s\n", plm_szErrorMsg);
         printf("pcbErrorMsg = %d\n\n", plm_pcbErrorMsg);

         if (ConnInd) {
            printf("ODBCRowNumber = %d\n", plm_Rownumber);
            printf("SSrvrLine = %d\n", plm_Rownumber);
            printf("SSrvrMsgState = %d\n", plm_SS_MsgState);
            printf("SSrvrSeverity = %d\n", plm_SS_Severity);
            printf("SSrvrProcname = %s\n", plm_SS_Procname);
            printf("SSrvrSrvname = %s\n\n", plm_SS_Srvname);
         }
      }

      plm_cRecNmbr++;   // Increment to next diagnostic record.
   }
}

// compile with: odbc32.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

#define MAXBUFLEN 256

SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;     
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;

void ProcessLogMessages(SQLSMALLINT plm_handle_type, SQLHANDLE plm_handle, char *logstring, int ConnInd);

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

   // 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) ) {
         ProcessLogMessages(SQL_HANDLE_DBC, hdbc1, "SQLConnect() Failed\n\n", FALSE);
         Cleanup();
         return(9);
   }
   else {
      ProcessLogMessages(SQL_HANDLE_DBC, hdbc1,
         "\nConnect Successful\n\n", FALSE);
   }

   // Allocate statement handle, and then execute command.
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
      ProcessLogMessages(SQL_HANDLE_DBC, hdbc1, "SQLAllocHandle(hstmt1) Failed\n\n", TRUE);
      Cleanup();
      return(9);
   }

   retcode = SQLExecDirect(hstmt1, (UCHAR*)"exec BadOne", SQL_NTS);
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
         ProcessLogMessages(SQL_HANDLE_STMT, hstmt1, "SQLExecute() Failed\n\n", TRUE);
         Cleanup();
         return(9);
   }

   // Clear any result sets generated.
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA )
      ;

   // Clean up. 
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

void ProcessLogMessages(SQLSMALLINT plm_handle_type, SQLHANDLE plm_handle, char *logstring, int ConnInd) {
   RETCODE plm_retcode = SQL_SUCCESS;
   UCHAR plm_szSqlState[MAXBUFLEN] = "", plm_szErrorMsg[MAXBUFLEN] = "";
   SDWORD plm_pfNativeError = 0L;
   SWORD plm_pcbErrorMsg = 0;
   SQLSMALLINT plm_cRecNmbr = 1;
   SDWORD plm_SS_MsgState = 0, plm_SS_Severity = 0;
   SQLINTEGER plm_Rownumber = 0;
   USHORT plm_SS_Line;
   SQLSMALLINT plm_cbSS_Procname, plm_cbSS_Srvname;
   SQLCHAR plm_SS_Procname[MAXNAME], plm_SS_Srvname[MAXNAME];

   if (logstring)
      printf(logstring);

   while (plm_retcode != SQL_NO_DATA_FOUND) {
      plm_retcode = SQLGetDiagRec(plm_handle_type, plm_handle, plm_cRecNmbr, 
                                  plm_szSqlState, &plm_pfNativeError, plm_szErrorMsg, 
                                  MAXBUFLEN - 1, &plm_pcbErrorMsg);

      // Note that if the application has not yet made a successful connection, 
      // the SQLGetDiagField information has not yet been cached by ODBC Driver Manager and 
      // these calls to SQLGetDiagField will fail.
      if (plm_retcode != SQL_NO_DATA_FOUND) {
         if (ConnInd) { 
            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                                        SQL_DIAG_ROW_NUMBER, &plm_Rownumber,
                                                        SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_LINE, &plm_SS_Line, SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr, 
                                           SQL_DIAG_SS_MSGSTATE, &plm_SS_MsgState,
                                           SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_SEVERITY, &plm_SS_Severity,
                                           SQL_IS_INTEGER, NULL);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_PROCNAME, &plm_SS_Procname,
                                           sizeof(plm_SS_Procname), &plm_cbSS_Procname);

            plm_retcode = SQLGetDiagField( plm_handle_type, plm_handle, plm_cRecNmbr,
                                           SQL_DIAG_SS_SRVNAME, &plm_SS_Srvname, 
                                           sizeof(plm_SS_Srvname), &plm_cbSS_Srvname);
         }

         printf("szSqlState = %s\n", plm_szSqlState);
         printf("pfNativeError = %d\n", plm_pfNativeError);
         printf("szErrorMsg = %s\n", plm_szErrorMsg);
         printf("pcbErrorMsg = %d\n\n", plm_pcbErrorMsg);

         if (ConnInd) {
            printf("ODBCRowNumber = %d\n", plm_Rownumber);
            printf("SSrvrLine = %d\n", plm_Rownumber);
            printf("SSrvrMsgState = %d\n", plm_SS_MsgState);
            printf("SSrvrSeverity = %d\n", plm_SS_Severity);
            printf("SSrvrProcname = %s\n", plm_SS_Procname);
            printf("SSrvrSrvname = %s\n\n", plm_SS_Srvname);
         }
      }

      plm_cRecNmbr++;   // Increment to next diagnostic record.
   }
}

Kodu

use AdventureWorks
DROP PROCEDURE BadOne
GO

use AdventureWorks
DROP PROCEDURE BadOne
GO

Ayrıca bkz.

Diğer Kaynaklar

odbc nasıl yapılır konuları