日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:32日期: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 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩av一区二区三区四区| 激情亚洲影院在线观看| 欧美成人高清| 久久精品国产99久久| 日韩.com| 成人精品天堂一区二区三区| 99热精品久久| 免费日韩av片| 蜜臀精品一区二区三区在线观看 | 91成人精品观看| 久久永久免费| 欧洲一区二区三区精品| 欧美.日韩.国产.一区.二区| 蜜臀av一区二区三区| 日本va欧美va欧美va精品| 久久久91麻豆精品国产一区| 精品捆绑调教一区二区三区| 国产免费成人| 国产精品久久国产愉拍| 日本激情一区| 亚洲视频播放| 日韩激情一二三区| 国产精品国产三级国产在线观看| 亚洲高清av| 日韩av中文字幕一区| 国产精品麻豆久久| 久久av一区二区三区| 国产精品第十页| 欧美成人日韩| 欧美日韩在线精品一区二区三区激情综合 | 精品国产91| 五月激情久久| 日韩欧美中文字幕在线视频| 四季av一区二区凹凸精品| 制服诱惑一区二区| 久久精品一本| 亚洲小说春色综合另类电影| 欧美激情久久久久久久久久久| 亚洲精品97| 欧美国产先锋| 欧美日韩亚洲在线观看| 国产精品videossex| 一区在线免费观看| 久久久久久网| 国产视频一区二| 尤物在线精品| 福利精品一区| 久久国内精品| 噜噜噜久久亚洲精品国产品小说| 精品久久91| 日韩精品免费视频一区二区三区| 久久久精品午夜少妇| 欧美一区影院| 日韩在线卡一卡二| 日韩免费福利视频| 欧美一区二区三区久久| 国产精品免费看| 欧美精品高清| 久久精品国产一区二区| 日韩欧美中文字幕电影| 激情久久久久久| 国产资源在线观看入口av| 国产欧美欧美| 日韩精品五月天| 国产精品社区| 国产99久久| 亚洲精品.com| 亚洲最新无码中文字幕久久| 国产精品毛片久久久| 亚洲精选av| 激情91久久| 91精品福利| 日韩精品影视| 激情亚洲影院在线观看| 欧美xxxx中国| 亚洲综合电影| 日韩毛片在线| 久久精品青草| 99免费精品| 欧美成人亚洲| 国产在线不卡| 国产一区久久| 激情婷婷久久| aa亚洲婷婷| 免费看日韩精品| 在线 亚洲欧美在线综合一区| 亚洲午夜视频| 日韩一区二区免费看| 狠狠爱成人网| 午夜在线精品偷拍| 亚洲性视频在线| 日韩欧美另类中文字幕| 91精品啪在线观看国产爱臀| 国产三级一区| 粉嫩av一区二区三区四区五区 | 国产精品亚洲四区在线观看| 国产日本精品| 国产欧美日韩视频在线| 久久av免费| 日本а中文在线天堂| 免费在线小视频| 久久蜜桃精品| 婷婷精品进入| 老司机精品久久| 综合五月婷婷| 亚洲bt欧美bt精品777| 欧美亚洲二区| 国产精品黄色片| 激情不卡一区二区三区视频在线| sm捆绑调教国产免费网站在线观看| 日韩成人高清| 久久都是精品| 欧美一区二区三区免费看| 免费一级欧美片在线观看网站 | 日韩中文av| 国产精品美女午夜爽爽| 国产成人1区| 亚洲激情不卡| 日韩中文一区二区| 精品一区二区三区视频在线播放| 97在线精品| 国产尤物精品| 日韩高清电影一区| 国产不卡人人| 爽好久久久欧美精品| 久久国际精品| 尤物tv在线精品| 日韩和欧美一区二区三区| 久久av网站| 亚洲激情婷婷| 国产日韩欧美中文在线| 99精品视频在线| 少妇高潮一区二区三区99| 久久精品一区二区三区中文字幕| 亚洲不卡av不卡一区二区| 视频一区在线视频| 另类小说一区二区三区| 亚洲女同一区| 久久99高清| 亚洲一区网站| 国精品产品一区| 亚洲伊人精品酒店| 国产精品99一区二区三| 综合五月婷婷| 久久精品国产亚洲夜色av网站| 青青草国产成人99久久| 日韩精品一卡| 国产精品99久久久久久董美香| 日韩免费福利视频| 日韩av资源网| 99在线精品免费视频九九视| 精品视频91| 天堂俺去俺来也www久久婷婷| 日韩精品第一区| 欧美日韩在线精品一区二区三区激情综合| 中文字幕系列一区| 国产精品一国产精品k频道56| 欧美日韩免费观看一区=区三区| 国产欧美日韩一区二区三区在线| 伊人成人网在线看| av高清不卡| 国产精品国码视频| 日韩中文字幕91| 日韩精品中文字幕第1页| 日韩精品三级| 合欧美一区二区三区| 国际精品欧美精品| 91成人精品在线| 蜜臀av国产精品久久久久| 日韩伦理一区| 蜜桃精品视频| 国产日韩欧美一区| 亚洲影视一区二区三区| 国产综合色产| 日韩欧美一区二区三区免费观看| 国产午夜久久av| 色综合视频一区二区三区日韩 | 三级亚洲高清视频| 91精品国产福利在线观看麻豆| 国产另类在线| 最近国产精品视频| 国产一级久久| 欧美 日韩 国产精品免费观看| 久久久久久久欧美精品| 国产aa精品| 麻豆高清免费国产一区| 最新亚洲国产| 欧美一区=区| 99热精品在线观看| 国产伊人精品| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 最新亚洲国产| 蜜臀久久99精品久久久久宅男 | 在线亚洲欧美| 在线综合亚洲| 午夜亚洲福利在线老司机| 欧美1区免费| 久久中文字幕av| 欧美日韩一区二区三区视频播放| 日韩成人亚洲|