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

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

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

瀏覽:35日期: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久久,三上悠亚国产精品一区二区三区
国产亚洲观看| 亚洲制服欧美另类| 久久九九99| 国产精品亚洲欧美| 亚洲色图综合| 99精品国产一区二区三区| 国产日韩在线观看视频| 亚洲在线网站| 久久免费大视频| 久久亚州av| 亚洲精品动态| 9久re热视频在线精品| 成人台湾亚洲精品一区二区| 日韩精品一区二区三区av| 午夜久久黄色| 都市激情国产精品| 日本aⅴ精品一区二区三区| 国产精品va| 国产日韩视频在线| 国产三级精品三级在线观看国产| 亚洲综合日韩| 中文精品视频| 日韩一区二区在线免费| 国产乱码精品一区二区三区亚洲人| 亚洲制服少妇| 亚洲天堂日韩在线| 中文字幕一区二区三区四区久久| 欧美日韩日本国产亚洲在线| 亚洲夜间福利| 亚洲一区二区三区免费在线观看| 91精品xxx在线观看| 欧美精品一二| 久久一区亚洲| 日本精品不卡| 国产精品日本一区二区不卡视频 | 国产成人77亚洲精品www| 国产精品流白浆在线观看| 久久只有精品| 在线看片国产福利你懂的| 成人黄色av| 欧美日韩国产免费观看| 一级欧美视频| 精品一区av| 九九色在线视频| 亚洲午夜在线| 亚洲精品一二| 国产精品男女| 激情欧美国产欧美| 日韩激情网站| 视频小说一区二区| 亚洲精品影视| 日韩久久视频| 亚洲男女自偷自拍| 亚洲一区二区三区久久久| 国产调教一区二区三区| 欧美精品羞羞答答| 久久精品国产福利| 欧美女激情福利| 国产成人精品亚洲线观看| 欧美精品羞羞答答| 精品国产一区二| 日韩美女精品| 女主播福利一区| 成人日韩av| 国产色噜噜噜91在线精品| 欧美日韩四区| 六月婷婷综合| 国产毛片久久久| 久久99伊人| 国产精品成人国产| 日本综合精品一区| 99久久精品费精品国产| 久久只有精品| 国产精品夜夜夜| 日本不卡一区二区| 免费一区二区视频| 久久高清免费观看| 国产福利一区二区三区在线播放| 欧美一区三区| 日韩激情av在线| 好看不卡的中文字幕| 欧洲精品一区二区三区| 国内精品美女在线观看| 国产精品99久久久久久董美香| 日韩1区2区3区| 麻豆精品av| 日韩一区电影| 一二三区精品| 国内一区二区三区| 久久久久免费| 丝袜美腿亚洲色图| 久久99影视| 国语精品一区| 在线观看免费一区二区| 亚洲精品国产精品粉嫩| 成人亚洲精品| 色综合视频一区二区三区日韩 | 国产精品久久久久77777丨| 精品在线网站观看| 久久福利一区| 日韩1区在线| 婷婷综合一区| 日韩电影免费在线观看| 视频在线观看91| 青草综合视频| 五月天久久久| 精品视频国产| 日韩欧美久久| 久久精品国产68国产精品亚洲| 亚洲欧洲av| 久久久精品五月天| 久久精品国产精品亚洲毛片| 国产99久久| av中文字幕在线观看第一页 | 开心激情综合| 伊人成人在线视频| 亚洲播播91| 国产精品久久久网站| 午夜性色一区二区三区免费视频| 久久麻豆精品| 国产成人精品福利| 久久在线91| 精品一区二区三区中文字幕 | 国产日韩一区二区三区在线| 亚洲伊人av| 不卡一区综合视频| 国产成人免费精品| 精品国产a一区二区三区v免费| 日本少妇精品亚洲第一区| 国产精品丝袜xxxxxxx| 亚洲免费黄色| 香蕉精品999视频一区二区| 成人精品天堂一区二区三区| 91亚洲国产高清| 精品三级久久| 久久婷婷av| 成人免费电影网址| 国产韩日影视精品| 国产综合亚洲精品一区二| 999久久久精品国产| 欧美成人综合| 亚洲精品激情| 国产精品一区二区三区www| 老牛国内精品亚洲成av人片| 国产精品麻豆久久| 日韩精品麻豆| 欧美精品九九| 亚洲精品亚洲人成在线观看| 久久精品99久久久| 伊人久久高清| 一二三区精品| 久久久久伊人| 国产精品久久久久久久久久齐齐 | 日韩在线综合| 91精品久久久久久久久久不卡| 夜夜嗨一区二区三区| 日韩黄色av| 国产一区二区三区四区五区| 成午夜精品一区二区三区软件| 欧美在线资源| 美女精品一区二区| 激情久久久久久| 国产欧美高清| 久久国产免费| 欧美黄色一区| 欧美高清一区| 欧美成a人片免费观看久久五月天| 成人自拍av| 国产精品久久久久77777丨| 99香蕉国产精品偷在线观看 | 日韩毛片在线| 91成人福利| 免费精品国产的网站免费观看| 夜夜嗨网站十八久久| 久久久久97| 蜜臀久久99精品久久久画质超高清| 亚洲麻豆一区| 久久久国产亚洲精品| 国产亚洲永久域名| 欧洲av不卡| 国产一区二区三区免费在线| 亚洲免费成人av在线| 激情国产在线| 成人国产精品一区二区免费麻豆| 亚洲精品系列| 蜜臀精品久久久久久蜜臀 | 黄色亚洲大片免费在线观看| 黑人精品一区| а√在线中文在线新版| 国产伦理一区| 91亚洲精品视频在线观看| 蜜桃av一区| 在线一区二区三区视频| 亚洲一区中文| 日韩深夜视频| 亚洲精品综合| 免费成人av在线播放| 视频精品一区二区| 热久久免费视频| 日本一不卡视频|