成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PROC++批量導入導出ORACLE數據庫表

瀏覽:5日期:2023-11-19 08:25:53
最近在開發一個項目中,為了解決數據庫IO瓶頸,不得不把數據庫中的數據導出為文本文件。文本傳到客戶端后又要導入到數據庫。本人用C++Builder嵌入PROC++寫了一個導入導出的DLL。假如對你有用深感榮幸!具體內容如下: 一、預備工作計算機環境:Win 2000 PRO,Oracle 9i,C++ Builder 5.5引入必要的ORACLE內部函數:要用的函數在$(ORACEL_HOME)bin qlora9.dll鏈接庫中。為了能在C++ Builder中使用,先得生成LIB:implib sqlora9.lib sqlora9.dll二、源文件分析//-------------------------------------------------------------------------//加入必要的頭文件#include<vcl.h> #include<windows.h> #include<stdio.h> #include<stdlib.h> #include<string.h>#include<time.h> #include<math.h> #include<fcntl.h> #include<io.h> #include<sys tat.h>//說明DLL的輸出函數extern 'C' _declspec(dlleXPort) int _stdcall ConnectDB(const char *Username, const char *PassWord, const char *Dbname);extern 'C' _declspec(dllexport) int _stdcall ImportTxtfile(TList *LengthArray, String *FieldArray, const char *TableName, const char *FileName);extern 'C' _declspec(dllexport) int _stdcall ExportTxtfile(const char *Sql, const char *FileName); #pragma hdrstop//----------------------------------------------------------------------------#define MAX_ITEMS 20;;;;;//定義最大字段數#define MAX_VNAME_LEN 30; //定義選擇表項最大長度#define MAX_INAME_LEN 30; //定義指示器變量名字的最大長度EXEC SQL INCLUDE sqlca;;//說明SQL通訊區EXEC SQL INCLUDE oraca;;//說明ORACLE通訊區EXEC SQL INCLUDE sqlda;;//說明SQL語句描述結構/*SQLDA結構體請查相關資料*/EXEC ORACLE OPTION (ORACA = YES);EXEC ORACLE OPTION (RELEASE_CURSOR = YES);//說明ORACLE外部函數extern 'C' _declspec(dllimport) void _stdcall sqlclu(SQLDA*);extern 'C' _declspec(dllimport) void _stdcall sqlnul(short*, short*, int*);extern 'C' _declspec(dllimport) void _stdcall sqlprc(int*, int*, int*);extern 'C' _declspec(dllimport) strUCt SQLDA * _stdcall sqlald(int, unsigned int, unsigned int);SQLDA *SelectUnit//定義選擇項描述SQLDA *BindUnit//定義輸入項空間//定義變量,以存放連接數據庫的參數EXEC SQL BEGIN DECLARE SECTION; char User[20];//用戶名 char Pwd[20];//密碼 char DB[20];//數據庫服務名EXEC SQL END DECLARE SECTION;bool bConnect = false;//是否連接標志#pragma hdrstop#pragma argsused//C++ Builder DLL的主函數BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved){ ;;return 1;}/*--------------------------------------------------------------------------- 連接數據庫---------------------------------------------------------------------------*/int _stdcall ConnectDB(const char *Username, const char *Password, ;;;const char *Dbname){ strcpy(User, Username); strcpy(Pwd, Password); strcpy(DB, Dbname); EXEC SQL CONNECT :User IDENTIFIED BY :Pwd USING :DB; if (sqlca.sqlcode < 0) return -1; bConnect = true; return 0;}/*---------------------------------------------------------------------------導出文本函數因為不確定SELECT語句的表及字段,所以我使用動態語句(ORACLE DYNAMIC SQL)的//第四種方式。 動態SQL方法四是在不確定SQL語句的選擇項與輸入項,且不知個數與數據類型的情況下使用的一種復雜程序設計技術。---------------------------------------------------------------------------*/int _stdcall ExportTxtfile(const char *Sql/*SQL選擇語句*/, const char FileName/*導出目標文本文件名*/){ int null_ok, precision, scale; int handle; if ((handle = open(FileName, O_CREATO_TEXTO_APPENDO_RDWR, S_IREADS_IWRITE)) == -1) { //文件打開出錯 return -1; }//定義變量,以存放SQL語句 EXEC SQL BEGIN DECLARE SECTION; char sqlstr[256]; EXEC SQL END DECLARE SECTION; //檢查是否連接數據庫 if (bConnect == false) return -2; strcpy(sqlstr/*.arr*/, Sql); //; sqlstr.len = strlen(sql); //給描述區分配空間; if ((SelectUnit = sqlald(MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN)) == (SQLDA *)NULL) { //空間分配失敗 return -3; } if ((BindUnit = sqlald(MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN)) == (SQLDA *)NULL) { //空間分配失敗 return -3; } //給查詢返回值存儲區分配空間 SelectUnit->N = MAX_ITEMS; for (int i=0; i < MAX_ITEMS; i++) { BindUnit->I[i] = (short *)malloc(sizeof(short *)); BindUnit->V[i] = (char *)malloc(MAX_VNAME_LEN); } for (int i=0; i < MAX_ITEMS; i++) { SelectUnit->I[i] = (short *)malloc(sizeof(short *)); SelectUnit->V[i] = (char *)malloc(MAX_VNAME_LEN); } EXEC SQL WHENEVER SQLERROR GOTO sqlerr;//DO sql_error('導出出錯');//設置SQL語句 EXEC SQL PREPARE SQLSA FROM :sqlstr; EXEC SQL DECLARE Cursorbase CURSOR FOR SQLSA; //輸入描述處理 BindUnit->N = MAX_ITEMS; EXEC SQL DESCRIBE BIND VARIABLES for SQLSA INTO BindUnit; if (BindUnit->F < 0) { return -4; //輸入項過多 } BindUnit->N = BindUnit->F; //打開光標 EXEC SQL OPEN Cursorbase USING DESCRIPTOR BindUnit; //選擇項處理 EXEC SQL DESCRIBE SELECT LIST for SQLSA INTO SelectUnit; if (SelectUnit->F < 0) { return -4; //選擇表項過多 } SelectUnit->N = SelectUnit->F;//因為所有格式,類型都是不確定的,所以要得到正確的返回值就要處理格式 for (int i=0; i < SelectUnit->F; i++) { sqlnul(&(SelectUnit->T[i]), &(SelectUnit->T[i]), &null_ok); switch (SelectUnit->T[i]) { ;;;;case 1://CHAR ;;;;;;;;;break; ;;;;case 2://NUMBER ;;;;;;;;;sqlprc(&(SelectUnit->L[i]), &precision, &scale); ;;;;;;;;;if (precision == 0) ;;;;;;;;;;;precision = 40; ;;;;;;;;;SelectUnit->L[i] = precision + 2; ;;;;;;;;;break; case 8://LONG ;;;SelectUnit->L[i] = 240; break; case 11://ROWID SelectUnit->L[i] = 18; break; case 12://DATE SelectUnit->L[i] = 9; break; case 23://RAW break; case 24://LONGRAW SelectUnit->L[i] = 240; break; } SelectUnit->V[i] = (char *)realloc(SelectUnit->V[i], SelectUnit->L[i]+1); SelectUnit->T[i] = 1;//把所有類型轉換為字符型 } EXEC SQL WHENEVER NOT FOUND goto EndFor; for (;;) { EXEC SQL FETCH Cursorbase USING DESCRIPTOR SelectUnit; //輸出各字段 for (int i=0; i < SelectUnit->F; i++) { char buffer[256]; if (i != SelectUnit->F-1) sprintf(buffer, '%s', SelectUnit->V[i]); else sprintf(buffer, '%srn', SelectUnit->V[i]); int length = strlen(buffer); if (write(handle, buffer, length) != length) { return -5; //寫文件失敗 exit(1); } } }EndFor: close(handle); for (int i=0; i < MAX_ITEMS; i++) { if (SelectUnit->V[i] != (char *)NULL) free(SelectUnit->V[i]); free(SelectUnit->I[i]); } for (int j=0; j < MAX_ITEMS; j++) { if (BindUnit->V[j] != (char *)NULL) free(BindUnit->V[j]); free(BindUnit->I[j]); } sqlclu(SelectUnit); sqlclu(BindUnit); EXEC SQL CLOSE Cursorbase; return 0;sqlerr: return -6;}/*----------------------------------------------------------------------------導入文本為了批量導入,在此我調用的sqlldr工具首先生成SQL*Loader控制文件,后運行sqlldr----------------------------------------------------------------------------*/int _stdcall ImportTxtfile(TList LengthArray/*導入文本的字段長度鏈表*/,String *FieldArray/*數據庫表的了段名數組*/, const char TableName/*導入的目標表*/, const char FileName/*導入的源文本文件*/){ //產生SQL*Loader控制文件 FILE *fout, *fp; char Execommand[256]; char sqlload[] = '. qlload.ctl'; //檢查是否連接數據庫 if (bConnect == false) return -2; if ((fout=fopen(sqlload, 'w')) == NULL) { //建立控制文件出錯 return -1 ; } fprintf(fout, 'LOAD DATAn'); fprintf(fout, 'INFILE '%s'n', FileName); fprintf(fout, 'APPEND INTO TABLE %s (n', TableName); int iStart = 1; for(int i=0; i < LengthArray->Count; i++) { fprintf(fout, '%11s POSITION(%d:%d)', FieldArray[i], iStart, *(int*)LengthArray->Items[i]+iStart-1); iStart += *(int*)LengthArray->Items[i]; fprintf(fout, ' CHAR'); if(i < LengthArray->Count-1) fprintf(fout, ',n'); } fprintf(fout, ')n'); fclose(fout); sprintf(Execommand, 'sqlldr.exe userid=%s/%s@%s control=%s', User, Pwd, DB, sqlload); if (system(Execommand) == -1) { //SQL*Loader執行錯誤 return -1; } return 0 ;}//----------------------------------------------------------------------------三、編譯用ORACLE的PROC預編譯器預編后,放入C++ Builder中聯編。 聯編時需加入前面生成的sqlora9.lib。聯編時還要注重,所有PROC生成的ORACLE內部函數調用都要說明為extern 'C' _declspec(dllexport) TYPE _stdcall類型。水平有限還請見諒!!!請多多指點。QQ:5005647
標簽: Oracle 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美精品七区| 亚洲午夜在线电影| 一区二区免费看| 亚洲午夜高清视频| 欧美国产一区视频在线观看| 99这里只有久久精品视频| 在线亚洲高清视频| 亚洲午夜久久久久久久久电影网| 亚洲国内欧美| 综合中文字幕亚洲| 国产欧美欧美| 午夜欧美在线一二页| 久久国产精品久久w女人spa| 亚洲成人动漫一区| 裸体一区二区| 午夜国产精品影院在线观看| 久久久999| 水野朝阳av一区二区三区| 久久精品主播| 全国精品久久少妇| 欧美日韩亚州综合| 国产在线日韩欧美| 91精品国产综合久久久久久久 | 快she精品国产999| 亚洲成人av一区| 色婷婷久久久综合中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩亚洲另类| 国产成人免费在线| 国产亚洲综合在线| 在线观看欧美亚洲| 午夜精品久久久久久久蜜桃app| 欧洲日韩一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 在线欧美日韩| 香蕉av福利精品导航| 欧美亚洲禁片免费| 成人午夜精品在线| 国产欧美日韩激情| 懂色av一区二区夜夜嗨| 国产午夜精品在线观看| 99精品国产在热久久| 亚洲成av人片一区二区梦乃| 欧美亚洲动漫精品| 高清不卡在线观看| 国产日韩欧美激情| 亚洲精品美女91| 国产精品免费一区二区三区观看| 国产精品多人| 牛牛国产精品| 最新久久zyz资源站| 亚洲日本激情| 在线免费日韩片| 美玉足脚交一区二区三区图片| 亚洲色图色小说| 天使萌一区二区三区免费观看| 蜜桃av一区二区三区电影| 视频一区欧美精品| 一区二区久久久久| 青青草国产成人99久久| 丁香激情综合五月| 久久精品国产99国产精品| 久久久精品免费免费| 亚洲国产欧美不卡在线观看| 亚洲黄网站在线观看| 欧美性生活一区| 国产 欧美在线| 国产精品看片你懂得| 国产精品日韩欧美一区二区| 日本不卡高清视频| 337p日本欧洲亚洲大胆精品 | 美国毛片一区二区三区| 精品久久久网站| 一区二区三区高清视频在线观看| 午夜精品爽啪视频| 欧美色图一区二区三区| 欧美jjzz| 丝袜a∨在线一区二区三区不卡| 日韩精品在线一区| 亚洲精品国产日韩| 国产美女在线观看一区| 成人免费在线观看入口| 欧美亚洲另类激情小说| 国产一区美女| 狠狠色狠狠色综合日日91app| 亚洲欧洲日产国码二区| 欧美日韩一区三区| 韩国av一区| 国产一区二区三区不卡在线观看| 国产精品久久毛片av大全日韩| 在线免费精品视频| 欧美日韩三级| 激情欧美一区二区| 国产精品国产三级国产普通话99| 欧美网站一区二区| 尤物在线精品| 国产高清一区日本| 亚洲国产精品自拍| 久久久777精品电影网影网 | 免费久久久一本精品久久区| 老鸭窝一区二区久久精品| 国产日韩三级在线| 在线亚洲人成电影网站色www| 欧美一区综合| 亚洲成人免费av| 91精品中文字幕一区二区三区| 91久久香蕉国产日韩欧美9色| 国产乱码精品一区二区三区忘忧草| 国产精品白丝在线| 欧美一区二区性放荡片| 亚洲综合三区| 欧美日本亚洲韩国国产| 久久99精品久久久久| 亚洲一区精品在线| 欧美激情一区二区三区蜜桃视频| 欧美日韩在线播| 国产精品亚洲一区| 亚洲欧美亚洲| 国产精品一区二区三区乱码| 一区二区免费看| 久久久三级国产网站| 欧美三级日本三级少妇99| av成人天堂| 91亚洲精品久久久蜜桃| 国内精品视频666| 亚洲线精品一区二区三区| 国产精品视频你懂的| 日韩欧美中文一区二区| 欧美亚洲另类激情小说| 亚洲一区二区三区四区五区午夜| 欧美1区2区3区| 国产乱人伦精品一区二区在线观看| 亚洲第一av色| 国产精品进线69影院| 26uuu国产日韩综合| 欧美日韩免费不卡视频一区二区三区| 99成人在线| 欧美福利电影在线观看| 成人激情综合网站| 国产精品亚洲视频| 蜜桃视频一区二区| 亚洲成av人片在线| 亚洲精品视频在线看| 国产精品国模大尺度视频| 久久久蜜臀国产一区二区| 欧美一级在线免费| 欧美嫩在线观看| 91国偷自产一区二区使用方法| 亚洲欧美日韩国产一区二区| 91久久在线| 国产真实久久| 欧美天堂亚洲电影院在线观看| 欧美国产激情| 欧美国产高潮xxxx1819| av不卡免费电影| 成人国产免费视频| 懂色av一区二区在线播放| 粉嫩av亚洲一区二区图片| 国产高清精品网站| 五月婷婷欧美视频| 日韩电影在线观看一区| 欧美图区在线视频| 水蜜桃久久夜色精品一区的特点| 亚洲人成在线观看一区二区| 国产精品毛片大码女人| 精品国产乱码久久| 日韩欧美二区三区| 欧美精品国产精品| 717成人午夜免费福利电影| 4438成人网| 欧美不卡123| 久久―日本道色综合久久| 26uuu精品一区二区三区四区在线| 精品国产一区二区亚洲人成毛片| 日韩欧美国产一区二区三区| 日韩欧美色综合网站| 2欧美一区二区三区在线观看视频| 久久综合狠狠综合久久激情| 久久久亚洲欧洲日产国码αv| 国产日韩视频一区二区三区| 久久久久久久久久久久久久久99 | 激情综合五月婷婷| 石原莉奈一区二区三区在线观看 | 国内在线观看一区二区三区| 亚洲天堂激情| 狠久久av成人天堂| 一本色道久久综合亚洲精品婷婷 | 久久伊人一区二区| 欧美四级电影在线观看| 7777女厕盗摄久久久| 日韩无一区二区| 国产亚洲欧洲一区高清在线观看| 国产精品久久久久久久午夜片| 亚洲视频在线观看三级| 日韩美女视频一区二区| 亚洲欧美怡红院| 亚洲一区二区在线免费看| 日韩精品电影一区亚洲| 激情六月婷婷久久| 99re热视频精品|