成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Sybase批量操作的實現

數據庫
在Sybase的使用過程中,經常會遇到批量操作的問題,下文對Sybase批量操作的實現作了詳盡的闡述,供您參考學習之用。

Sybase批量操作應該如何實現呢?下面就為您詳細介紹Sybase批量操作的事項方法,如果您對Sybase批量操作方面感興趣的話,不妨一看。

一、前言

在項目研發過程中,需要開發一個Sybase批量操作的動態鏈接庫(DLL),以前的實現主要是程序中直接調用bcp.exe,這種方式由應用程序創建子進程,不好控制批量操作過程,失敗跟蹤難度比較大,因此想利用bcp.exe調用的函數來實現操作過程。本人通過分析bcp.exe程序,得到了批量操作的DB LIBRARY API函數,再查閱API函數的資料得以實現該動態鏈接庫。

二、實現

批量操作動態鏈接庫只實現了一個輸出函數, 應用程序通過動態加載DLL,再獲取函數地址,便可調用函數實現Sybase批量操作。

輸出函數定義如下:

  1. LIBBCP_API BOOL BCP_Transfer_2(const char *task, const char *step, const char *config, long *copiedrow);  

在動態鏈接庫中定義了兩個類:CInteriorGlobal和CSYBBCP。CInteriorGlobal完成全局的初始化操作,CSYBBCP實現數據庫的批量操作。
在調用Sybase數據庫的DB LIBRARY API函數進行數據庫的相關操作時,首先需要調用dbsetversion函數設置版本信息,這個函數只能調用一次,如果再次調用則會報錯。而類CSYBBCP在BCP_Transfer_2函數中動態創建和釋放,如果在CSYBBCP中直接調用dbsetversion會導致多次調用出錯。因此需要采用一種機制讓dbsetversion只能調用一次,這里使用了設計模式中的SingleTom模式,SingleTom模式就是確保實例唯一,本人利用該類僅做一次實例化操作來初始化Sybase客戶端版本信息。

下面是CInteriorGlobal的定義:

  1. class CInteriorGlobal  
  2. {  
  3. public:  
  4. static CInteriorGlobal *Instance();  
  5. private:  
  6. CInteriorGlobal();  
  7. private:  
  8. static CInteriorGlobal *_instance;  
  9. };  

CInteriorGlobal的實現,在構造函數中設置版本信息:

  1. CInteriorGlobal::CInteriorGlobal()  
  2. {  
  3. dbsetversion(DBVERSION_100);  
  4. }  
  5. CInteriorGlobal    *CInteriorGlobal::_instance  = 0;  
  6. CInteriorGlobal * CInteriorGlobal::Instance()  
  7. {  
  8. if(0 == _instance)  
  9. _instance = new CInteriorGlobal;  
  10. return _instance;  
  11. }  

為了完成批量操作,定義類CSYBBCP,具體定義如下:

  1. class CSYBBCP  
  2. {  
  3. public:  
  4. CSYBBCP();  
  5. ~CSYBBCP();  
  6. BOOL        DoConnect(int taskindex, int stepindex, char *server, char *database, char *username,  
  7. char *password, char *charset, char *language);  
  8. BOOL        DoQuery(char *sql, char **buf, int *rowcount, int *fieldcount);  
  9. BOOL        DoUpdate(char *sql, char *database = NULL);  
  10. BOOL        BCP_Connect(int taskindex, int stepindex, char *server, char *database,  
  11. char *username, char *password, char *charset, char *language);  
  12. BOOL        BCP_Transfer_db(char *sql, char *fldterminator, char *rowterminator, int direction,  
  13. char *datafile, char *errfile, long *copiedrow);  
  14. private:  
  15. BOOL        m_isbcpout;  
  16. int         m_stepindex;  
  17. int         m_taskindex;  
  18. char        m_viewname[MAX_STRING_NUM];  
  19. char        m_database[MAX_STRING_NUM];  
  20. DBPROCESS  *m_dbproc;  
  21. private:  
  22. int         GetTableFieldNums(char *table);  
  23. BOOL        DoDisconnect();  
  24. };  

在類CSYBBCP中,主要是函數BCP_Transfer_db進行數據庫大批量數據的導入和導出,要完成數據傳輸操作,需要如下幾個步驟:

  1. // 初始化:指定表明和數據文件  
  2. if(bcp_init(m_dbproc, tablename, datafile, NULL, direction) == FAIL)  
  3. {  
  4. return FALSE;  
  5. }  
  6. // 設置批量操作的控制參數,這里設置的每批記錄數  
  7. if(bcp_control(m_dbproc, BCPBATCH, (DBINT) 1000) == FAIL)  
  8. {  
  9. return FALSE;  
  10. }  
  11. // 設置列數  
  12. if(bcp_columns(m_dbproc, cCols) == FAIL)  
  13. {  
  14. return FALSE;  
  15. }  
  16. // 設置列格式  
  17. for(ii = 1; ii < cCols; ii++)  
  18. {  
  19. if(bcp_colfmt(m_dbproc, ii, SYBCHAR, 0, -1, (UINT8 *) fldterminator, _strlen(fldterminator), ii) == FAIL)  
  20. {  
  21. return FALSE;  
  22. }  
  23. }  
  24. if(bcp_colfmt(m_dbproc, ii, SYBCHAR, 0, -1, (UINT8 *) rowterminator, _strlen(rowterminator), ii) == FAIL)  
  25. {  
  26. return FALSE;  
  27. }  
  28. // 執行批量操作  
  29. while(bcp_exec(m_dbproc, & cRows) == FAIL)  
  30. {  
  31. return FALSE;  
  32. }  
  33. // 批量操作結束  
  34. retcode = bcp_done(m_dbproc);  

在使用Sybase12.5客戶端之前,程序未調用bcp_control函數,在執行bcp_exec函數時不是使用while,而是使用if判斷,代碼如下:

  1. if(bcp_exec(m_dbproc, & cRows) == FAIL)  
  2. {  
  3. return FALSE;  
  4. }  

程序能正常完成功能,當使用Sybase12.5客戶端后,在執行時發現程序突然退出,異常處理也未能記錄日志,后跟蹤發現程序是在執行bcp_exec時退出,但是未能查出原因,咨詢Sybase公司技術人員,也沒能解決問題。后來在一次測試中偶然發現有時能導入數據,于是測試數據文件在什么情況下能導入,實驗其臨界點,多次測試后發現文件1000條記錄為臨界點,超過則出現問題。于是本人在程序中調用bcp_control函數,設置批量記錄為1000,如果數據文件記錄多于1000,則需要bcp_exec執行多次才能完成,所以采用while,而不是if,這樣問題解決。

三、結束

在上面的論述中,還僅僅涉及DB LIBRARY,對于Sybase客戶端編程,還有CT LIBRARY方式,目前CT已經支持導出,但不支持導入。

 


【編輯推薦】

設置SYBASE用戶口令為空

深入探究SYBASE數據庫日志

Sybase日期函數應用示例

Sybase建立索引的原則

Sybase分頁顯示存儲過程

責任編輯:段燃 來源: 互聯網
相關推薦

2024-10-11 12:00:00

Python批量文件操作

2010-11-29 09:12:46

sybase分頁存儲過

2010-11-29 13:28:55

sybase自動備份

2010-11-24 11:13:07

MySQL批量導入

2010-10-28 10:37:54

Oracle批量賦權

2009-09-27 14:33:01

Hibernate批量

2023-11-03 15:15:50

SQL數據庫

2010-11-29 13:50:38

Sybase清除日志

2010-11-29 10:22:46

Sybase建立索引

2013-05-02 10:03:59

網絡管理網絡設備交換機

2022-07-27 10:39:27

Python打包工具

2009-11-24 14:45:08

PHP批量上傳圖片

2010-05-27 14:35:25

MySQL批量導入

2023-12-18 16:07:15

2013-09-22 11:37:32

SAP

2010-11-29 13:09:07

sybase系統默認字

2011-09-01 14:44:27

ubuntu

2011-10-31 09:35:50

2010-11-03 10:26:22

DB2存儲過程

2009-09-14 10:29:02

LINQ刪除記錄
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩av在线播 | 国产精品日韩 | 中文字幕第一页在线 | 亚洲第一网站 | 在线免费观看日本 | 女人av| 亚洲免费在线 | 三级黄色片在线播放 | 亚洲1区 | 一级黄色绿像片 | 国产精品2 | 国产一区二区电影 | 999精品视频 | 国产日韩亚洲欧美 | 亚洲国产精品久久久久秋霞不卡 | 一区二区不卡视频 | 国产精品美女久久久 | 天堂中文av| 欧美一区二区在线看 | 欧美精品久久久 | 亚洲午夜精品视频 | 成人精品视频在线 | 久久com | 国产精品久久久久久久久 | 成人18亚洲xxoo | 欧美视频第三页 | 久久久国产精品 | 午夜精品在线 | 女人毛片a毛片久久人人 | 久久国产免费看 | 午夜视频在线观看一区二区 | 国产视频1区2区 | 亚洲成年人免费网站 | 成人亚洲精品 | 国产一区亚洲 | 在线免费黄色 | 日韩在线精品视频 | 国产视频精品免费 | 暖暖成人免费视频 | 欧美高清hd | 麻豆av网站 |