青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

用CLI開發DB2存儲過程

Posted on 2009-03-30 16:16 Prayer 閱讀(748) 評論(0)  編輯 收藏 引用 所屬分類: DB2
王隆彥


  前 言


  在用大型關系型數據庫DB2進行具體開發時,存儲過程的編寫是經常要考慮的問題之一。本文將結合實例,對使用CLI來開發DB2存儲過程進行詳細闡述。


  ■DB2存儲過程


  存儲過程(Store Procedure)是Client/Server應用中的一種編程方式,主要是為了解決客戶端應用訪問數據庫時可能出現的網絡負擔過重的問題。

  一般意義上,DB2為存儲過程的編寫提供了三種方式(不包括直接使用DB2的Store Procedure Builder生成的方式):第一種是嵌入式SQL編程;第二種是CLI編程;第三種是純SQL編程。本文將重點介紹CLI編程。


  ■CLI編程


  CLI(Call Level Interface)編程是DB2提供的一種編寫動態數據庫讀寫程序的方式。在CLI編程中,所有SQL語句都通過DB2提供的一組C語言函數來執行,因此可以在Visual Studio中直接開發。下面,我們首先要簡單介紹一下CLI的工作過程和方式。

  CLI程序主要由三個部分組成:首先是環境變量初始化過程,其次是語句的執行,最后是環境變量的釋放。我們將通過一個具體的例子來討論這三個過程。


  ■開發實例


  該例子的數據庫是DB2可以自動生成的Sample庫,例子所完成的操作是從數據庫中獲取ID等于輸入參數值的員工姓名,例子的整個過程雖然非常簡單,但已經包含了CLI編程的基本思路和步驟。

  1. 初始化環境變量

  在CLI中有三個句柄,分別是環境句柄、連接句柄、語句句柄。在初始化過程中首先要對前兩個句柄逐一進行獲取,獲取成功后可連接數據庫并獲取第三個句柄。

  SQLRETURN ret;

  SQLHENV henv; // 環境句柄

  SQLHDBC hdbc; // 連接句柄

  SQLHSTMT hstmt; // 語句句柄

  SQLCHAR DBNAME[]="SAMPLE"; //數據庫名

  SQLCHAR USERNAME[]="db2admin"; // 用戶名

  SQLCHAR PSW[]="ibmdb2"; // 口令

  ret=SQLAllocEnv(&&henv) //分配環境句柄

  ret=SQLAllocConnect(henv,&&hdbc)

  //分配連接句柄

  ret=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)

  //設置連接屬性

  ret=SQLConnect(hdbc,DBNAME,SQL_NTS,USERNAME,SQL_NTS,PSW,SQL_NTS) //連接數據庫

  ret=SQLAllocStmt(hdbc,&&hstmt)

  //分配語句句柄

  上面的每個函數都有返回值,如果函數成功,ret值為SQL_SUCCESS,否則將返回錯誤代碼。

  2. 語句的執行

  語句的執行分四個階段:首先準備數據接收的緩沖區,然后執行準備好的SQL語句,第三步是將語句句柄和數據緩沖區進行綁定,最后獲取數據。程序如下:

  char RowBuffer[100][200];

  //數據緩沖區,其大小可自定義

  typedef struct sqldat

  { SQLCHAR ColumnName[50];

   SQLSMALLINT BufferLength;

   SQLSMALLINT NameLength;

   SQLSMALLINT DataType;

   SQLUINTEGER ColumnSize;

   SQLSMALLINT FAR DecimalDigitsPtr;

   SQLSMALLINT FAR NullablePtr;

  } sqldata;

  // 為第三步的綁定準備一個數據結構

  sqldata RowDesc[100];

  //用于綁定的變量,維數與緩沖區對應

  memset(RowBuffer,64,100200);

  //給緩沖區賦初始值,可以用于最后判斷是否真正從數據庫中獲取了數據,這一步也可以省略

  char tempsql[100];

  sprintf(tempsql,"select NAME from db2admin.STAFF where ID= %s ",Condition);

  // Condition為變量值,可由用戶輸入

  sql=(SQLCHAR ) tempsql;

  ret=SQLPrepare(hstmt,sql,SQL_NTS)

  // 執行準備

  ret=SQLExecute(hstmt) // 執行

  執行成功后可進行綁定過程

  SQLINTEGER nullindicator;

  SQLINTEGER displaysize[MAX_COLUMN];

  SQLSMALLINT i;

  SQLSMALLINT num_columns;

  SQLNumResultCols(hstmt,&&num_columns);

  //準備綁定用的相關變量

  for(i=1;i< =num_columns;i++)

   {

  RowDesc[i-1].BufferLength=200;

  SQLDescribeCol(hstmt,i, RowDesc[i-1].ColumnName,RowDesc[i-1].BufferLength,&&(RowDesc[i-1].NameLength),&&(RowDesc[i-1].DataType),&&(RowDesc[i-1].ColumnSize),RowDesc[i-1].DecimalDigitsPtr,RowDesc[i-1].NullablePtr);

  SQLColAttribute(hstmt,(SQLSMALLINT)(i),SQL_DESC_DISPLAY_SIZE,NULL,0,NULL,&&displaysize[i-1]);

  RowDesc[i-1].ColumnSize=max(displaysize[i-1],strlen((char)RowDesc[i-1].ColumnName))+1;

  SQLBindCol( hstmt, (SQLSMALLINT)i,

  SQL_C_CHAR,(SQLPOINTER)(RowBuffer[i-1]),RowDesc[i-1].ColumnSize,

  &&nullindicator);

 ?。?/循環綁定

  //綁定完成后,可以將數據讀至緩沖區

  while(SQLFetch(hstmt)!=SQL_NO_DATA)

  {

  // SQLFetch函數將已經獲取的數據存入緩沖區

  //此處的操作方式與ESQL中的游標類似,支持對結果集的操作

  //每執行一次SQLFetch函數會把當前獲取的一行數據讀到緩沖區中

  //RowBuffer[i]中將存放該行的第i 列數據值

  //本例中只有一行數據

  }

  char m_name[10];

  memcpy(m_name,RowBuffer[0],10);

  //從緩沖區中將結果讀到用戶變量中

  3. 釋放環境變量

  在數據獲取完成后,可以將環境變量釋放掉,但要注意釋放的先后順序。

  SQLFreeStmt(hstmt,SQL_DROP);

  // 釋放語句句柄

  SQLDisconnect(hdbc);//與數據庫斷開

  SQLFreeConnect(hdbc);//釋放連接句柄

  SQLFreeEnv(henv);//釋放環境句柄

  經過上面的步驟,就完成了對數據庫的讀取過程。

  4. 生成目標存儲過程

  從上面的過程看,CLI編程無疑是非常復雜的,但如果我們使用一些輔助手段來組織整個過程,其編程過程和調試步驟將會大大簡化。本文的例子使用了微軟的Visual Studio 6.0來幫助組織。在Visual C++中用Wizard生成一個DLL工程,然后將數據庫的初始化、綁定、釋放三個過程函數化,并在相應的地方調用函數。在調試時只需針對語句的執行部分,合適的調試方式是不直接生成DLL,而先生成一個普通的EXE工程來完成所需的工作,待調試成功后將相關代碼移到DLL工程中。過程函數化的另一個好處是在編寫多個存儲過程時代碼重用率高,對于剛才提到的這種調試方式也很有利。使用Visual C++的優點還有編譯和鏈接過程簡單,不用在命令行的方式下操作,也不需要去記憶許多復雜的參數。不過要記住將db2cli.lib包含進工程中,否則在鏈結過程中會有錯誤,還要做的一件事是按DLL工程中的要求編輯工程中的def文件以提供函數的可調用出口。

  在DLL生成并調試通過后,剩下的工作與ESQL編程方式中的相應階段類似,要手工編輯一個DB2文件并執行它,這里就不再復述了。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美色123| 麻豆成人在线观看| 午夜精品久久久久久久久久久久久 | 伊人夜夜躁av伊人久久| 亚洲激情偷拍| 欧美激情a∨在线视频播放| 宅男精品视频| 日韩午夜一区| 久久精品国产精品| 久久久xxx| 欧美成人在线影院| 国产精品久久久久久久久久直播| 国产精品v亚洲精品v日韩精品| 国产精品美腿一区在线看| 国产欧美一区视频| 91久久久国产精品| 亚洲欧美综合v| 亚洲国产日韩美| 亚洲欧美日韩第一区| 美乳少妇欧美精品| 国产精品色婷婷| 日韩一级黄色av| 欧美在线啊v| 亚洲一二三区精品| 你懂的视频欧美| 欧美一区二区三区免费视频| 欧美午夜片欧美片在线观看| 在线观看日韩av电影| 久久久精品日韩| 亚洲一二三四久久| 欧美精品日韩综合在线| 亚洲国产天堂久久综合网| 久久久久久久欧美精品| 午夜精品美女久久久久av福利| 欧美四级电影网站| 亚洲永久精品大片| 亚洲区欧美区| 亚洲黄页视频免费观看| 久热这里只精品99re8久| 国产精品天天看| 欧美1区2区视频| 久久精品99国产精品| 狠狠做深爱婷婷久久综合一区| 亚洲一级片在线看| 亚洲欧美成人一区二区三区| 欧美日韩免费一区二区三区视频 | 亚洲第一精品福利| 美女精品国产| 久久免费高清| 国产美女精品视频| 久久久久久自在自线| 久久精品国亚洲| 韩国女主播一区| 欧美激情在线免费观看| 欧美激情国产日韩| 亚洲一区二区少妇| 欧美在线观看一区二区| 亚洲成色777777在线观看影院| 欧美一区二区成人| 亚洲一卡二卡三卡四卡五卡| 欧美成人影音| 亚洲乱码久久| 亚洲精品在线观| 欧美色欧美亚洲高清在线视频| 亚洲第一中文字幕在线观看| 午夜精品福利视频| 新狼窝色av性久久久久久| 欧美日一区二区在线观看| 国产一区二区在线观看免费播放| 国产日韩亚洲欧美综合| 亚洲女爱视频在线| 欧美一二三区精品| 在线综合亚洲欧美在线视频| 老巨人导航500精品| 亚洲人成毛片在线播放| 国产手机视频精品| 日韩一级片网址| 亚洲天堂av高清| 国产精品电影观看| 中文精品在线| 亚洲欧美一区二区三区久久| 欧美日韩另类一区| a4yy欧美一区二区三区| 一区二区三区欧美在线| 欧美韩日精品| 一区二区三区偷拍| 亚洲一区二区日本| 韩国欧美国产1区| 欧美国产视频在线观看| 亚洲人成在线观看| 亚洲免费视频在线观看| 国产一区视频观看| 欧美伊人久久久久久午夜久久久久 | 午夜欧美不卡精品aaaaa| 国内久久视频| 欧美大片18| 亚久久调教视频| 欧美激情一区二区三区在线| 91久久精品国产91久久| 国产精品久久久一区二区| 久久亚洲春色中文字幕久久久| 欧美激情视频一区二区三区免费 | 欧美精选一区| 亚洲图片欧洲图片日韩av| 久久久青草青青国产亚洲免观| 在线成人www免费观看视频| 国产精品久久久一区二区| 欧美精品手机在线| 蜜乳av另类精品一区二区| 久久精品成人| 久久精品99| 巨胸喷奶水www久久久免费动漫| 亚洲免费福利视频| 亚洲二区精品| 欧美成人精品一区| 欧美成人久久| 久久免费视频在线观看| 亚洲性视频网站| 日韩午夜在线电影| 一区二区精品| 午夜精品影院| 欧美一级艳片视频免费观看| 在线性视频日韩欧美| 99视频超级精品| 亚洲免费高清| 亚洲视频一区二区| 亚洲视频在线观看| 一区二区三区免费观看| 亚洲欧美综合国产精品一区| 亚洲欧美乱综合| 久久免费一区| 最新亚洲一区| 亚洲午夜精品久久久久久app| 亚洲综合成人在线| 亚洲国产日韩综合一区| 亚洲天堂av图片| 久久久午夜电影| 欧美国产精品日韩| 亚洲欧美美女| 欧美喷潮久久久xxxxx| 很黄很黄激情成人| 欧美中文在线免费| 欧美日韩高清在线| 国产日韩精品一区二区三区在线| 激情欧美日韩| 香蕉久久久久久久av网站| 玖玖视频精品| 亚洲一区亚洲| 欧美日韩一区二区三区在线观看免| 国产专区欧美精品| 亚洲欧美国产精品va在线观看 | 性欧美超级视频| 亚洲电影av在线| 免费成人av| 亚洲麻豆视频| 你懂的视频一区二区| 久久蜜桃资源一区二区老牛| 国产精品区一区| 亚洲一区999| 一本一本大道香蕉久在线精品| 欧美大学生性色视频| 亚洲区免费影片| 欧美午夜无遮挡| 久久精品综合网| 久久野战av| 亚洲毛片一区| 一区二区欧美在线观看| 国产精品嫩草99a| 亚洲欧美日韩一区二区三区在线 | 亚洲小视频在线观看| 99国产精品久久久久久久成人热| 美女网站在线免费欧美精品| 一本色道久久综合亚洲精品不卡| 在线一区二区视频| 伊人夜夜躁av伊人久久| 亚洲高清视频一区二区| 欧美午夜电影完整版| 久久久水蜜桃| 国产精品久久久久久久久免费| 久久伊人一区二区| 最新国产乱人伦偷精品免费网站| 欧美国产日韩一区| 久久精品道一区二区三区| 欧美区视频在线观看| 欧美诱惑福利视频| 欧美性色综合| 亚洲国内精品在线| 亚洲成人资源网| 欧美一激情一区二区三区| 一本色道**综合亚洲精品蜜桃冫 | 99香蕉国产精品偷在线观看| 国产日韩欧美夫妻视频在线观看| 日韩亚洲欧美成人| 亚洲作爱视频| 欧美日韩精品免费| 日韩视频在线免费| 亚洲自拍啪啪| 国产精品久久777777毛茸茸| 欧美福利一区二区三区| 狠狠色伊人亚洲综合成人|