Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編
目次 索引 前ページ次ページ

第2章 データベースを処理する応用プログラムの開発の概要> 2.1 SQL埋込みCプログラムの作成方法

2.1.7 日本語可変長文字列のデータ操作

ここでは、ホスト変数の日本語可変長文字列をCプログラムで操作するプログラミング例を説明します。ホスト変数の日本語可変長文字列をCプログラムで操作する場合は、文字列の長さが必要です。このため、翻訳時には、日本語可変長文字列の長さと日本語文字列を持つ構造体に変換します。Cプログラムは、変換された構造体の変数でデータ操作を行います。

図:日本語可変長文字列を構造体形式に変換した例に日本語可変長文字列を構造体形式に変換した例を示します。

図:日本語可変長文字列のデータ操作の概要にプログラムの処理概要を、図:日本語可変長文字列のデータ操作のプログラミング例にプログラミング例を示します。

[図:日本語可変長文字列を構造体形式に変換した例]

応用プログラム中に以下のように宣言します。      
  VARCHAR CHARACTER SET NCHAR hcomp_word[31];   
                                                
                  ↓翻訳時に構造体に変換します。
                                                
  struct  {                                    
          short    sqllen;                      
          char     sqlvar[31];                  
  } hcomp_word;                                

[図:日本語可変長文字列のデータ操作の概要]

(1) 製品名を、ホスト変数の日本語可変長文字列に対話で入力します。

(2) CONNECT文により、データベース“DB01"の存在するサーバとコネクションを接続します。

(3) カーソル操作により、在庫表から入力された製品名に該当する在庫のデータを検索します。

(4) 在庫のデータを端末に出力します。

(5) DISCONNECT文により、データベース“DB01"の存在するサーバとのコネクションを切断します。

[図:日本語可変長文字列のデータ操作のプログラミング例]

#include<stdio.h>                                                                     
#include<string.h>                                                                    
                                                                                      
                                                                                      
EXEC SQL BEGIN DECLARE SECTION;                                                       
        char  SQLSTATE[6];                                                            
        char  SQLMSG[256];                                                            
        VARCHAR CHARACTER SET NCHAR hcomp_word[31];                              (1) 
        long  hnumber;                                                                
        char CHARACTER SET NCHAR        hproduct[31];                                 
        long  hstock;                                                                 
        long  hstorehouse;                                                            
EXEC SQL END   DECLARE SECTION;                                                       
                                                                                      
void putmsgx();                                                                       
                                                                                      
main(void) {                                                                          
            short   execute;                                                          
            short   count;                                                            
    EXEC SQL DECLARE 在庫 TABLE ON BUSINESS;                                     (2) 
    EXEC SQL DECLARE CSR1 CURSOR FOR                                                  
                            SELECT * FROM 在庫 WHERE 製品名=:hcomp_word;         (3) 
                                                                                      
    printf("入力された製品名に該当する在庫のデータを取り出します.\n");                
                                                                                      
    for(;;){                                                                          
            printf("日本語で製品名を入力して下さい >>");                              
            gets(hcomp_word.sqlvar);                                             (4) 
            printf("\n");                                                            
            printf("製品\"%s\"のデータでよろしいですか?\n",hcomp_word.sqlvar);       
            printf("よろしかったら(Y/y)を入力して下さい >>");                         
            execute=getchar();                                                        
            if(execute=='Y' || execute=='y'){                                         
                    break;                                                            
            }                                                                         
            printf("\n");                                                             
    }                                                                                 
                                                                                      
    printf("\n");                                                                     
    hcomp_word.sqllen = strlen(hcomp_word.sqlvar);                                (5) 
                                                                                      
    EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;                                   
                                                                                      
    EXEC SQL CONNECT TO 'DB01';                                                   (6) 

(1) 製品名を日本語可変長文字列のホスト変数として定義します。

(2) 在庫表を表宣言します。

(3) 在庫表のカーソル“CSR1"を宣言します。

(4) 対話処理で、製品名を入力します。入力領域は、日本語可変長文字列変数“hcomp_word"を翻訳時に構造体に変換した変数“hcomp_word.sqlvar"に入力します。

(5) 入力した製品名の長さを、日本語可変長文字列変数“hcomp_word"を翻訳時に構造体に変換した変数“hcomp_word.sqllen"に設定します。

(6) データベース“DB01"の存在するサーバとのコネクションを接続します。

    EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;                                       
    EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;                                
                                                                                      
    EXEC SQL OPEN CSR1;                                                           (7) 
                                                                                      
    printf("\n製品番号  製品名                  在庫数量  倉庫番号\n");               
    for(count=0;;count++){                                                           
          memset(hproduct,'\0',sizeof(hproduct));                                 (8) 
                                                                                      
          EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock,:hstorehouse;       (9) 
                                                                                      
          printf("%08ld  %-20s  %08ld  %08ld\n"                                   (10)
                          ,hnumber,hproduct,hstock,hstorehouse);                      
    }                                                                                
NOT_FOUND_ERROR:                                                                      
                                                                                      
        if(count != 0)  printf("\n該当データは%d件です.\n",count);                (11)
        else            printf("\n該当データなし\n");                                 
        EXEC SQL WHENEVER SQLERROR CONTINUE;                                          
        EXEC SQL ROLLBACK WORK;                                                   (12)
        EXEC SQL DISCONNECT 'DB01';                                               (13)
        return 0;                                                                     
                                                                                      
STM_ERROR:                                                                            
        putmsgx();                                                                (14)
        EXEC SQL WHENEVER SQLERROR CONTINUE;                                          
        EXEC SQL ROLLBACK WORK;                                                   (15)
        EXEC SQL DISCONNECT 'DB01';                                               (16)
        return 1;                                                                     
                                                                                      
CONNECT_ERROR:                                                                        
        putmsgx();                                                                (17)
        return 1;                                                                     
}                                                                                    

(7) カーソル“CSR1"をオープンします。

(8) ホスト変数の“hproduct"をnull文字で初期化します。

(9) 入力した製品名と等しい在庫表の製品名の行にカーソルを位置づけ、その行を読み込みます。

(10) 読み込んだ行をprintf関数で表示します。

(11) 在庫表のデータをすべて検索した場合は、検索結果をprintf関数で表示します。

(12) トランザクションをROLLBACK文により終了します。

(13) データベース“DB01"の存在するサーバとのコネクションを切断します。

(14) SQL文の実行でエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。

(15) SQL文の実行でエラーの場合は、トランザクションをROLLBACK文により終了します。

(16) データベース“DB01"の存在するサーバとのコネクションを切断します。

(17) コネクションでエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。

void putmsgx( void )  {                                                          (18)
    int i;                                                                            
    for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );                          
    SQLMSG[++i] = '\0';                                                               
    SQLSTATE[5]='\0';                                                                 
    printf( "SQLMSG:%s\n" , SQLMSG );                                                 
    printf( "SQLSTATE:%s\n" , SQLSTATE );                                             
    return;                                                                           
}                                                                                    

(18) SQLMSGとSQLSTATEの内容を表示する関数です。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006