• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              3 隨筆 :: 10 文章 :: 0 評論 :: 0 Trackbacks

            代碼如下:

            //所有的ODBC函數(shù)都以SQL開始

            #include <conio.h>//getch()
            #include <stdio.h>
            #include <afxwin.h>//// MFC core and standard components
            #include <sqlext.h> //包含有擴展的ODBC的定義
            #include <sql.h> //包含有基本的ODBC API的定義
            #include <odbcinst.h>
            #pragma comment(lib, "odbc32.lib")
            #pragma comment(lib, "odbccp32.lib")//SQLConfigDataSource()函數(shù)

            //#include "sqltypes.h"
            //#include "sqlucode.h"
            //#include "odbcss.h"


            int main(int argc, char* argv[])
            {
            ?
            ?SQLRETURN sr=SQL_SUCCESS;
            ?SQLHENV? hEnv=0; //分配odbc環(huán)境
            ?SQLHDBC? hDbc=0;//
            ?SQLHSTMT hStmt;//

            ?//
            ?SQLINTEGER iID;//第一列
            ?SQLCHAR tmJoin[20];//第二列
            ??? SQLCHAR szName[10];//第三列
            ?SQLREAL fTall;//第四列
            ?SQLINTEGER cbID,cbJoin,cbName,cbTall;//保存得到的數(shù)據(jù)的長度
            ?//
            ?int i=0;
            ?SQLCHAR?? SqlState[6];
            ?SQLINTEGER NativeError;
            ?SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
            ?//
            ?char szDSN[] = "TestDB";//ODBC數(shù)據(jù)源
            ?char szUID[] = "sa"; //SQL用戶
            ?char szPWD[] = ""; //口令
            ??? LPCSTR svSQL="select * from [ApiOdbc]";

            ?//創(chuàng)建ODBC句柄,分配odbc環(huán)境
            ?/*對于任何ODBC應用程序來說,第一步的工作是裝載驅動程序管理器,然后初始化ODBC環(huán)境,分配環(huán)境句柄。
            ??? 首先,程序中聲明一個SQLHENV類型的變量,然后調用函數(shù)SQLAllocHandle,向其中傳遞分配的上述SQLHENV類型
            ?的變量地址和SQL_HANDLE_ENV選項。如下代碼所示:SQLHENV henv;SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
            ??? 執(zhí)行該調用語句后,驅動程序分配一個結構,該結構中存放環(huán)境信息,然后返回對應于該環(huán)境的環(huán)境句柄。
            ?SQLRETURN SQLAllocHandle(
            ??????SQLSMALLINT?? HandleType,
            ??????SQLHANDLE???? InputHandle,第二個參數(shù)為輸入句柄
            ??????SQLHANDLE *?? OutputHandlePtr 第三個參數(shù)為輸出句柄
            ???????);??
            ?SQL_HANDLE_ENV:申請環(huán)境句柄。
            ??? SQL_HANDLE_DBC:申請數(shù)據(jù)庫連接句柄
            ?SQL_HANDLE_STMT:申請SQL語句句柄,每次執(zhí)行SQL語句都申請語句句柄,并且在執(zhí)行完成后釋放*/
            ???
            ?//利用動態(tài)鏈接庫Odbcinst.dll動態(tài)創(chuàng)建DSN
            ?if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=TestDB\0Description=TestAPIODBC\0SERVER=(local)\0DATABASE=TestDB"))
            ?{
            ??printf("32位ODBC數(shù)據(jù)源配置 Success!\n\n");
            ?}
            ???
            ?sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
            ?if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
            ?{
            ??printf("1~~創(chuàng)建環(huán)境句柄SQLAllocHandle Success!\n");
            ?}
            ??? //設定odbc版本,將ODBC設置成為版本3,否則某些ODBC API 函數(shù)不能被支持
            ?sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
            ?if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
            ?{
            ??printf("2~~SQLSetEnvAttr Success!\n");
            ?}
            ?//分配odbc連接句柄
            ?/*分配環(huán)境句柄后,在建立至數(shù)據(jù)源的連接之前,我們必須分配一個連接句柄,每一個到數(shù)據(jù)源的連接對應于一個連接句柄。
            ??? 首先,程序定義了一個SQLHDBC類型的變量,用于存放連接句柄,然后調用SQLAllocHandle函數(shù)分配句柄。如下代碼所示:
            ??? SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);henv為環(huán)境句柄。*/
            ??? sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
            ??? if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
            ?{
            ??printf("3~~創(chuàng)建連接句柄SQL_HANDLE_DBC Success!\n");
            ?}
            ??? //連接連接屬性
            ?/*當連接句柄分配完成后,我們可以設置連接屬性,所有的連接屬性都有缺省值,但是我們可以通過調用函數(shù)SQLSetConnectAttr()
            ?來設置連接屬性。用函數(shù)SQLGetConnectAttr()獲取這些連接屬性。函數(shù)格式如下:
            ?SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
            ?SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
            ??? 應用程序可以根據(jù)自己的需要設置不同的連接屬性。*/
            ?sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)7,0);
            ??? if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
            ?{
            ??printf("4~~設置連接屬性SQLSetConnectAttr Success!\n");
            ?}
            ?
            ?//連接
            ?/*完成對連接屬性的設置之后,就可以建立到數(shù)據(jù)源的連接了。對于不同的程序和用戶接口,可以用不同的函數(shù)建立連接:
            ?SQLConnect、SQLDriverConnect、SQLBrowseConnect。
            ??? SQLConnect該函數(shù)提供了最為直接的程序控制方式,我們只要提供數(shù)據(jù)源名稱、用戶ID和口令,就可以進行連接了。
            ??? 函數(shù)格式:SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3);
            ??? 參數(shù):ConnectionHandle 連接句柄,ServerName 數(shù)據(jù)源名稱,NameLength1 數(shù)據(jù)源名稱長度,UserName 用戶ID
            ?NameLength2 用戶ID長度,Authentication 用戶口令,NameLength3 用戶口令長度
            ?返回值:SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.
            ?成功返回SQL_SUCCESS*/
            ?sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
            ??? /*如果返回值為SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函數(shù)SQLGetDiagRec獲取相應SQLSTATE的值*/
            ?if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
            ?{
            ??TRACE("ERROR");
            ??while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbc,i,SqlState, &NativeError,ErrMsg,sizeof(ErrMsg),NULL)!= SQL_NO_DATA)
            ???TRACE("Diag : %d SQLSTATE :%s NativeError : %d ,ErrMsg : %s\n",i ++,SqlState,NativeError,ErrMsg);
            ?}
            ?else
            ?{
            ??printf("5~~連接Connect Success!\n");
            ??? }
            ?//分配語句句柄sr = SQLAllocStmt(hDbc,&hStmt);SQLAllocStmt() 已被廢棄,且替換為 SQLAllocHandle();
            ?sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
            ??? if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
            ?{
            ??printf("6~~分配語句句柄SQL_HANDLE_STMT Success!\n");
            ?}

            ??? //執(zhí)行SQL查詢語句
            ?sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
            ??? if (sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
            ??? {
            ??????? printf("7~~執(zhí)行SQL查詢語句SQLExecDirect Success!\n");
            ??printf("\n-------------get date from db-------------\n");
            ??while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
            ??{
            ???//執(zhí)行SQL語句后遍歷結果集來得到數(shù)據(jù)
            ???SQLGetData(hStmt, 1, SQL_C_ULONG, &iID, 0, &cbID);
            ???SQLGetData(hStmt, 2, SQL_C_CHAR,? tmJoin, 20, &cbJoin);//datatime類型放在SQLCHAR數(shù)組中,數(shù)組length要足夠
            ???SQLGetData(hStmt, 3, SQL_C_CHAR,? szName, 10, &cbName);
            ???SQLGetData(hStmt, 4, SQL_C_FLOAT, &fTall, 0, &cbTall);
            ???printf("%d~~~%s~~~%s~~~%f\n",iID,tmJoin,szName,fTall);
            ??}
            ?}

            ??? //釋放句柄
            ?if(hStmt!=SQL_NULL_HANDLE)
            ?{
            ??SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
            ???? hStmt=NULL;
            ?}
            ?if(hDbc != SQL_NULL_HANDLE)
            ?{
            ??sr = SQLDisconnect(hDbc);
            ??SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
            ??hDbc=NULL;
            ?}
            ?if(hEnv != SQL_NULL_HANDLE)
            ?{
            ??SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
            ??hEnv=NULL;
            ?}
            ?//
            ?printf("API ODBC Success!\n");
            ?system("PAUSE");
            ?return 0;
            }

            ?

            ?

            ?

            ?

            posted on 2006-07-03 20:18 dbsky 閱讀(691) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫編程
            一本一本久久A久久综合精品 | 国内精品久久九九国产精品| 久久精品国产99久久无毒不卡| 青青草国产精品久久| 久久笫一福利免费导航 | 伊人久久大香线蕉综合Av| 秋霞久久国产精品电影院| 久久精品免费一区二区| 国产成人久久久精品二区三区| 色诱久久av| 久久最新免费视频| 久久国产精品-国产精品| 久久99精品久久久久子伦| 久久精品桃花综合| 久久无码高潮喷水| 久久久亚洲AV波多野结衣| 久久亚洲中文字幕精品一区| 亚洲午夜无码久久久久| 国色天香久久久久久久小说 | 久久综合一区二区无码| 久久99精品久久久久久水蜜桃| 久久久久AV综合网成人| 2021久久精品国产99国产精品| 99久久久精品免费观看国产| 四虎国产精品免费久久久| 国产综合精品久久亚洲| 久久久久国产精品嫩草影院| 精品一区二区久久久久久久网站| 久久久中文字幕日本| 久久精品国产亚洲AV电影| 国产免费久久精品99久久| 人妻少妇久久中文字幕一区二区| 久久国产色AV免费观看| 久久久久久国产a免费观看不卡 | 亚洲人成无码网站久久99热国产 | 久久影院久久香蕉国产线看观看| 久久男人Av资源网站无码软件| 久久亚洲中文字幕精品一区四| 97精品国产91久久久久久| 久久综合给合久久狠狠狠97色| 噜噜噜色噜噜噜久久|