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

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>
            免费试看一区| 欧美激情国产高清| 影音先锋久久久| 国产精品老牛| 国产精品丝袜xxxxxxx| 欧美日韩亚洲国产一区| 欧美精品二区| 欧美视频在线观看| 亚洲网站在线看| 亚洲无限乱码一二三四麻| 亚洲一区亚洲二区| 久久精品国产999大香线蕉| 国产一区二区在线观看免费播放| 美日韩在线观看| 欧美日本国产在线| 久久精品亚洲一区二区| 日韩视频一区二区三区在线播放免费观看| 91久久中文字幕| 亚洲精品美女91| 亚洲中字黄色| 免费久久99精品国产自在现线| 欧美精品国产精品日韩精品| 国产精品欧美日韩一区二区| 黄网站免费久久| 宅男精品视频| 久久九九热re6这里有精品| 欧美顶级大胆免费视频| 亚洲深夜福利视频| 亚洲第一精品电影| 亚洲一区二区视频在线观看| 久久亚洲综合网| 国产欧美成人| 中文日韩欧美| 欧美激情免费在线| 亚洲欧洲久久| 国产一级久久| 亚洲免费一在线| 欧美激情在线观看| 久久xxxx| 欧美一区二区三区在| 国产综合色在线| 性做久久久久久| 一区二区三区视频在线播放| 免费亚洲电影| 在线观看日韩国产| 久久久www| 午夜精品福利视频| 国产精品女主播| 亚洲视频一区在线观看| 在线观看精品| 欧美专区在线观看| 夜夜嗨av一区二区三区网站四季av| 久久久精品一区| 欧美日韩亚洲综合一区| 国内精品国语自产拍在线观看| 久久夜色精品国产欧美乱| 亚洲综合好骚| 91久久国产精品91久久性色| 欧美中文字幕不卡| 国产精品二区影院| 亚洲欧洲久久| 久久女同互慰一区二区三区| 亚洲作爱视频| 免费在线观看一区二区| 国自产拍偷拍福利精品免费一| 亚洲欧美日本日韩| 亚洲毛片在线观看| 亚洲小视频在线| 欧美性生交xxxxx久久久| 欧美1区免费| 国产在线播精品第三| 小辣椒精品导航| 一区二区三区四区五区在线 | 亚洲久久一区| 男女激情视频一区| 一区二区在线视频播放| 欧美在线免费| 亚洲欧美综合| 国内精品亚洲| 久久久xxx| 欧美一区二区三区视频免费播放 | 亚洲精品影视| 蜜桃久久av| 久久精品中文| 今天的高清视频免费播放成人| 久久狠狠亚洲综合| 久久精品亚洲一区二区三区浴池| 亚洲精品久久久久久一区二区| 美乳少妇欧美精品| 久久精品国产欧美激情| 国产视频一区在线观看一区免费| 亚洲一区精彩视频| 老司机精品视频网站| 99re这里只有精品6| 亚洲综合国产| 欧美一二三区精品| 狠狠干综合网| 亚洲国产精品www| 欧美日韩在线一二三| 99精品国产一区二区青青牛奶| 亚洲人成亚洲人成在线观看| 欧美人成免费网站| 欧美亚洲在线播放| 久久美女艺术照精彩视频福利播放| 尤物yw午夜国产精品视频明星| 女女同性精品视频| 欧美日韩视频在线观看一区二区三区| 亚洲特色特黄| 久久aⅴ乱码一区二区三区| 麻豆国产精品777777在线| 免费中文字幕日韩欧美| 在线观看一区| 一区二区三区精品| 国产一区在线看| 亚洲高清一区二| 欧美国产91| 亚洲专区在线视频| 在线日韩精品视频| 亚洲作爱视频| 亚洲激情视频网站| 亚洲在线日韩| 在线免费观看欧美| 亚洲精品久久久久中文字幕欢迎你| 欧美三区美女| 欧美99在线视频观看| 国产精品乱码久久久久久| 亚洲一区不卡| 欧美日韩亚洲综合| 欧美v亚洲v综合ⅴ国产v| 国产精品进线69影院| 欧美韩国日本综合| 欧美一区二区成人| 99精品国产热久久91蜜凸| 欧美在线免费视频| 亚洲欧美韩国| 久久精品成人| 老鸭窝91久久精品色噜噜导演| 欧美日韩免费一区| 欧美日韩视频第一区| 91久久极品少妇xxxxⅹ软件| 欧美亚洲一区在线| 亚洲欧美日韩国产成人| 欧美激情一区二区三区在线| 蜜桃久久av一区| 欧美午夜a级限制福利片| 久久99伊人| 国产精品久久激情| 亚洲久久一区二区| 亚洲精品久久久久中文字幕欢迎你 | 亚洲第一二三四五区| 久久高清免费观看| 99re8这里有精品热视频免费| 亚洲欧美福利一区二区| 亚洲一区久久久| 欧美午夜免费电影| 亚洲美女91| 99xxxx成人网| 亚洲一区日韩| 欧美一区二区三区四区在线观看地址| 亚洲欧美国内爽妇网| 狂野欧美一区| 亚洲精选大片| 午夜精彩国产免费不卡不顿大片| 欧美手机在线视频| 亚洲视频电影图片偷拍一区| 亚洲一区欧美二区| 国产一区二区三区高清播放| 欧美一二区视频| 免费在线观看成人av| 亚洲国产裸拍裸体视频在线观看乱了| 美女脱光内衣内裤视频久久影院| 午夜精品区一区二区三| 精品盗摄一区二区三区| 久久午夜激情| 在线视频一区二区| 欧美无砖砖区免费| 欧美一区二区黄色| 另类专区欧美制服同性| 亚洲黄色尤物视频| 久久久91精品国产一区二区精品| 欧美大片免费看| 亚洲日本成人网| 性欧美激情精品| 欧美系列一区| 久久国产婷婷国产香蕉| 欧美国产精品专区| 午夜在线成人av| 日韩亚洲欧美成人一区| 国产精品久久九九| 久久人人97超碰国产公开结果| 性欧美精品高清| 亚洲欧洲另类| 国产精品久久久久久久久久久久 | 久久久久久91香蕉国产| 亚洲黄色免费| 国产精品日韩欧美综合 | 亚洲专区一区二区三区| 午夜精品久久久久久99热软件| 亚洲欧美国产不卡| 欧美精品久久久久久久|