1. 程式人生 > >ODBC連線MySQL資料庫操作例項

ODBC連線MySQL資料庫操作例項

 

以下展示的一段程式,完成利用ODBC對MySQL資料庫操作功能,我的編譯環境時VC6,程式碼中有詳細的解釋,如果事先完成ODBC資料來源的設定工作,那麼只要對程式碼稍作修改即可使用:

#include<stdlib.h>

#include<stdio.h>

#include<windows.h>

#include<sql.h>

#include<sqlext.h>

#include<Sqltypes.h>

#include<iostream.h>

int main()

{

     /*Step 1 定義控制代碼和變數 */

      SQLHENV hEnv;

      SQLHDBC hConnect;

           SQLHSTMT hStmt;

      SQLRETURN r;

      // 分配環境控制代碼

      r = SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

      if ( r != SQL_SUCCESS )

      {

         cout << "SQLAllocHandle error!" << endl ;

         exit(1);

      }

      // 設定環境控制代碼

      r = SQLSetEnvAttr ( hEnv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0 );

      if ( r != SQL_SUCCESS )

      {

         cout << "SQLSetEnvAttr error!" << endl ;

         exit(1);

      }

      // 分配連線控制代碼

      r = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hConnect);

      if ( r != SQL_SUCCESS )

      {

         cout << "SQLAllocHandle error!" << endl ;

         exit(1);

      }

           /*之上的程式程式碼讀者直接貼上即可,無限修改;至於具體語句或函式的功能,沒有必要深入瞭解,

             只要清楚每一步的作用(註釋給出)即可*/

      /* 連線ODBC資料庫,主要函式中第二個引數test為操作的資料來源的名稱;第四個引數是操作資料庫的使用者名稱

              第六個引數是操作資料庫的密碼*/

      r = SQLConnect ( hConnect, (SQLCHAR*) "test", SQL_NTS, (SQLCHAR*) "yuanbohx",

                     SQL_NTS, (SQLCHAR*) "xiaohuanxiong60", SQL_NTS);

      if ( r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO )

      {

         cout << "SQLConnect error!" << endl;

         exit (1);

      }

      char SQLString[200] ;            //用於儲存SQL語句

           // 分配語句控制代碼

           r = SQLAllocHandle ( SQL_HANDLE_STMT, hConnect, &hStmt);

           if ( r != SQL_SUCCESS )

           {

                   cout << "SQLAllocHandle error!" << endl ;

                   exit(1);

           }

           // 執行SQL查詢(第二個引數即你想執行的SQL語句)

           strcpy ( SQLString, "select * from test");

           r = SQLExecDirect( hStmt, (SQLCHAR *)SQLString, SQL_NTS);

           if ( r != SQL_SUCCESS )

           {

             cout << "SQLExecDirect error!" << endl ;

             exit(1);

           }

           // 繫結資料並輸出 

           SQLCHAR authorName[20] ;

           SQLCHAR bookID[20] ;

           SQLINTEGER auName = SQL_NTS;       //函式SQLGetData中會用到

           SQLINTEGER bID = SQL_NTS;

           while(1)

           {

                     r = SQLFetch(hStmt);   //資料庫遊標,當對某一行表項操作成功後,遊標下移一位

                     if(r == SQL_ERROR || r == SQL_SUCCESS_WITH_INFO)

                     {

                            cout << "SQLFetch error!" << endl ;

                            exit(1);

                     }

                     /*SQLGetData用於檢索結果集資料,其中使用者可修改的引數為:引數2表示取第幾列的資料;引數3表示資料型別SQL_C_X,

                       X為具體的資料型別,如CHAR、INT等;引數4是存放資料的變數;引數5指向的緩衝區的最大大小,

                       如果引數4是二進位制或字串,則引數5必須大於0;引數6事先要定義(名字可以引數4相關聯),然後其值賦為SQL_NTS

                     */

                     if ( r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)

                     {

                              SQLGetData(hStmt,1,SQL_C_CHAR,authorName,20,&auName);

                              SQLGetData(hStmt,2,SQL_C_CHAR,bookID,20,&bID);

                              printf("%s\t%s\n" , bookID , authorName);

                     }

                     else

                              break ;

           } 

      return 0;

}