在C中嵌入SQL語句訪問DB2資料庫

來源:互聯網
上載者:User

本文來自【http://www.cppblog.com/prayer/archive/2008/09/03/60795.html】

 

 

SQL/C學習筆記 在C中嵌入SQL

公司最近有個項目,需要在Linux下訪問DB2資料庫,Linux在我機器上裝了好幾年了也沒碰過,鬱悶。DB2

就只是聽說過,沒有見過。C倒是用過一段時間。於是開啟百度,狗狗開搜。
於是找到一部分文章,從中找了一些代碼:短小,感覺適合入門。被我改了改,程式如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA;
main()
{
 EXEC SQL BEGIN DECLARE SECTION;
 char firstname[130];
 char userid[9];
 char passwd[19];
 EXEC SQL END DECLARE SECTION;

 EXEC SQL CONNECT TO Test;
 EXEC SQL SELECT SEALNAME INTO :firstname
 FROM SEAL fetch first 1 row only;

 printf( "First name = %s\n", firstname );
 EXEC SQL CONNECT RESET;
 return 0;
}
我就不解釋這段程式了,網上一搜解釋的都比我好。一會最後貼出原貼方便以後使用。
開啟VC編輯環境,將代碼貼了進去。編譯。我考,一堆錯誤,說什麼不認識EXEC ....,這是怎麼回事啊

,難道是少包含了標頭檔,趕快找啊。找了一堆,加上,外甥打燈籠-照舊(招舅)。TNND,再查。

好長時間過去了,怎麼得有幾個小時吧,狗狗都累了。最後才明白,VC編譯器不能直接編譯這種代碼,(

我突然覺得怎麼有點像ASP呢,混在一起)必須先使用前置處理器將這些代碼轉換成c代碼,VC編譯環境才能

認。那怎麼轉換呢?使用什麼樣的前置處理器呢?再查,忘了是從哪查到一個 DB2 prep *.sqc bindfile命

令,感覺上這個可以了,馬上運行cmd開啟控制台,輸入試,N次後我差點一屁股就坐地上了,前面帶了個

DB2,應該是在DB2的命令列下運行吧,於是在bin下找到了什麼exe來著,就是命令列工具中的全集視窗。

開啟,輸入,興奮啊。在我可愛的sqc檔案旁邊出了個.c的檔案,哈哈,就是他了。

或許是我高興的太早,或許是我運氣不好,該例子始終過不去,沒報什麼錯
,NND。這是為啥?!難道我的SQL語句錯了?!在DB2的控制台下再試,考,成功。再運行我的程式,還

是報這個錯。改程式,或許是我的Select 語句不行,我建個表試試不取資料總行吧。於是有了如下的代

碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>

EXEC SQL INCLUDE SQLCA;
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;

int check_error (char eString[], struct sqlca *caPointer)
{
 char eBuffer[1024];
 char sBuffer[1024];
 short rc, Erc;
 if (caPointer->sqlcode != 0)
  {
  printf ("--- error report ---\n");
  printf ("ERROR occured : %s.\nSQLCODE : %ld\n", eString,
  caPointer->sqlcode);
 }
 return 0;
}

int main(int argc, char *argv[])
{
 EXEC SQL BEGIN DECLARE SECTION;
 char firstname[13];
 char userid[9];
 char passwd[19];
 EXEC SQL END DECLARE SECTION;
 printf( "Sample C program: STATIC\n" );
 if (argc == 1)
 {
  EXEC SQL CONNECT TO test user test using hdshtest;
  CHECKERR ("CONNECT TO SAMPLE");
 }
 else if (argc == 3)
 {
  strcpy (userid, argv[1]);
  strcpy (passwd, argv[2]);
  EXEC SQL CONNECT TO test USER :userid USING :passwd;
  CHECKERR ("CONNECT TO SAMPLE");
 }
 else
 {
  printf ("\nUSAGE: static [userid passwd]\n\n");
  return 1;
 } /* endif */

    // create table
  EXEC SQL CREATE TABLE tbname(col1 SMALLINT,
                                       col2 CHAR(7),
                                       col3 VARCHAR(7),
                                       col4 DEC(9, 2),
                                       col5 DATE,
                                       col6 BLOB(5000),
                                       col7 CLOB(5000));

 CHECKERR("Table -- Create");

    EXEC SQL COMMIT;
    CHECKERR("Transaction -- Commit");
 
 /*
    
     EXEC SQL SELECT account.moneytype INTO :firstname FROM test.account fetch first

1 row only;
 */
 EXEC SQL SELECT name INTO :firstname FROM accounttype where id = '1';
 CHECKERR ("SELECT statement");
 printf( "First name = %s\n", firstname );
 EXEC SQL CONNECT RESET;
 CHECKERR ("CONNECT RESET");
 return 0;
}
/* end of program : STATIC.SQC */

重複上述步驟,重建了.C的檔案,還是出不了我要的結果,但是我加上出錯處理了, 先看看出錯信

息,出錯資訊如下:
sqlcode:  -805
sqlstate:  51002
這是什麼東西?再搜。我可是在百度上搜了N分鐘啊。大多是java的,看不懂。老天不負我有心人呐,最

終找到瞭解釋:

請問db2的這個錯誤是什麼意思?

DB2 SQL error: SQLCODE: -805, SQLSTATE: , SQLERRMC: NULLID.SYSSH200

回答:
解釋:  此資訊 (SQLCODE) 的可能原因是:

o   未在資料庫中定義指定的程式包或程式。

o   未聯編該程式或它已被卸下。

o   正在啟動並執行應用程式未與資料庫聯編。

o   若試圖運行 DB2 公用程式或 CLI 應用程式, 則 DB2
    公用程式可能需要重新聯編至資料庫。

不能處理該語句。

使用者響應:
指定正確的程式包名或聯編該程式。若正在啟動並執行應用程式未與資料庫聯編
,則與資料庫管理員聯絡以執行必需的聯編。

若 DB2
公用程式需要重新聯編至資料庫,則當串連至資料庫時,資料庫管理員可以
通過從執行個體的 bnd 子目錄發出下列 CLP 命令之一來完成此操作: 

o   對於 DB2 公用程式,發出 "DB2 bind @db2ubind.lst blocking all
    grant public"。

o   對於 CLI,發出 "DB2 bind @db2cli.lst blocking all grant
    public"。

聯合體系統使用者:確保在適用的資料來源上聯編 聯合體伺服器
所必需的程式包。參考“安裝和配置補遺”指南以擷取有關將程式包與資料
源聯編的詳情。

sqlcode:  -805

sqlstate:  51002
當真是遇上救星了?於是乎,我將剛才搜到的資訊總結了一下,三句話:

如果您打完補丁10後,您需要對每一個資料庫執行
db2 terminate
db2 CONNECT TO <dbname>
db2 BIND <path>/db2schema.bnd BLOCKING ALL GRANT PUBLIC sqlerror continue
db2 terminate

DB2 bind @db2ubind.lst blocking all grant public
DB2 bind @db2cli.lst blocking all grant public

bind "C:\Program Files\IBM\SQLLIB\BINtestmain.bnd" BLOCKING ALL GRANT PUBLIC sqlerror

continue

如上在DB2後輸入的上述命令,我暈,程式還是不對。不能出來正確結果。今天註定我一晚上睡不好嗎?
就是我要失去信心的時候,發現了在我的.c的旁邊一直躲著個.bnd的檔案。考,再bind一次這個傢伙。哈哈哈,我要的結果出來了!爽,痛快,寫下來,省得過幾天忘了,有做這方面的朋友也可以少走些彎路,呵呵。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.