1. 程式人生 > >資料庫--資料提取:ODBC源

資料庫--資料提取:ODBC源

ODBC是一種標準,或則是一種封裝,使得資料庫有一種一致和清晰的工作方式。
1、如何在windows中建立ODBC源?建立SQL server 的資料來源

控制面板,新增到系統DSN,命名資料來源名,資料來源描述,輸入資料庫名稱,測試成功,即可以使用;

2、程式碼讀取ODBC資料來源
    // ODBC.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include"windows.h"
#include"sql.h"
#include"sqlext.h"
#include"sqltypes.h"
#include<cstdlib>
#include<iostream>

using namespace std;
//---end

#pragma comment(lib, "odbc32.lib")
/********************************** 
 模  塊:獲取OBDC資料來源資料
 版  本:來自於MSDN
 作  者:
 建立日期:
 功  能:
 參  數:
 返回值:
 其  他:
*************************************************/
SQLCHAR file_context[102400000]={0};
void getDavieData()
{
    SQLHENV serverhenv;
    SQLHDBC serverhdbc;
    SQLHSTMT serverhstmt = 0;
    SQLRETURN ret;
    SQLCHAR file_id[20]={0};
    SQLCHAR file_type[20]={0} ;
    //BLOB    te_file;
    //SQLCHAR te_file[1024]={0};
    SQLINTEGER length;
    SQLPOINTER rgbValue = NULL;

    ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);

    ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
    if(!SQL_SUCCEEDED(ret))
    {
        cout<<"AllocEnvHandle error!"<<endl;
        system("pause");
        return;
    }    

    
    ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
    if(!SQL_SUCCEEDED(ret))
    {
        cout<<"AllocDbcHandle error!"<<endl;
        system("pause");
        return;
    }    

    // Set login timeout to 5 seconds
    ret = SQLSetConnectAttr(serverhdbc, SQL_LOGIN_TIMEOUT,SQLPOINTER(5), 0);

    (serverhdbc, 資料庫名稱,SQL_NTS,使用者名稱,密碼,SQL_NTS)
    ret = SQLConnect(serverhdbc,(SQLCHAR*)"XX資料庫名",SQL_NTS,NULL,SQL_NTS,NULL,SQL_NTS);
    if(!SQL_SUCCEEDED(ret))
    {
        SQLCHAR SQLState[10] ={0};
        SQLINTEGER integer= 0 ;
        SQLCHAR szText[200] ={0};
        SQLSMALLINT nTxtLen = 0;
        ret = SQLGetDiagRec(SQL_HANDLE_STMT, serverhstmt, 1, SQLState,&integer, szText,200,&nTxtLen);
        system("pause");
    }  
    ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);
    //ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"SELECT \"te_comp\",\"te_vstype\"  FROM \"tbadmin\".\"tb_v
    ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"SELECT \"file_id\",\"file_type\",\"file_context\"  FROM \"表名\" --WHERE te_comp = '1734893'",SQL_NTS);
    if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        
        ret = SQLBindCol(serverhstmt,1, SQL_C_CHAR, (void*)file_id,sizeof(file_id), &length);
        ret = SQLBindCol(serverhstmt,2, SQL_C_CHAR, (void*)file_type,sizeof(file_type), &length);
        //ret = SQLBindCol(serverhstmt,3, SQL_C_BINARY, (void*)&te_file,sizeof(te_file), &length);
        
        if(!SQL_SUCCEEDED(ret))
        {
            SQLCHAR SQLState[10] ={0};
            SQLINTEGER integer= 0 ;
            SQLCHAR szText[200] ={0};
            SQLSMALLINT nTxtLen = 0;
            ret = SQLGetDiagRec(SQL_HANDLE_STMT, serverhstmt, 1, SQLState,&integer, szText,200,&nTxtLen);
            system("pause");
        }   

        
        CreateDirectoryA("**檔名**", 0); //這檔名稱
        while(SQL_NO_DATA != SQLFetch(serverhstmt))
        {              
            ret = SQLGetData(serverhstmt,3, SQL_C_CHAR, (void*)file_context,sizeof(file_context), &length);
            char fName[20] = {0};
            sprintf(fName, "**檔名**\\%s_%s", file_id,file_type);
            FILE* fp = fopen(fName, "wb");
            fwrite(file_context, strlen((char*)file_context), 1, fp);
            fclose(fp);

            if(!SQL_SUCCEEDED(ret))
            {
                SQLCHAR SQLState[10] ={0};
                SQLINTEGER integer= 0 ;
                SQLCHAR szText[200] ={0};
                SQLSMALLINT nTxtLen = 0;
                ret = SQLGetDiagRec(SQL_HANDLE_STMT, serverhstmt, 1, SQLState,&integer, szText,200,&nTxtLen);
                system("pause");
            }   
            cout<<"name:"<<file_id<<"  ID:"<<file_type << "DATA: ";
            cout<<endl;
        }    
    }

    
    ret=SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
    if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
        cout<<"free hstmt error!"<<endl;

    
    ret=SQLDisconnect(serverhdbc);    
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"disconnected error!"<<endl;

    
    ret=SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"free hdbc error!"<<endl;

    
    ret=SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"free henv error!"<<endl;
    system("pause");
}