資料庫--資料提取: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");
}