C言語埋め込みinformix基礎入門例説明

5893 ワード

 
  
#include
#include
#include
#include

$struct _db_person
{
    char   name[30+1];
    char   card[12+1];
    int    age;
};

char *trim(char *str)
{
    char *p, *buffer;
    int  len;

    if( NULL!=str )
    {
        len = strlen(str);
        if( len > 0 )
        {
            buffer=(char *)malloc(sizeof(char)*(len+1));
            if( NULL != buffer )
            {
                memmove(buffer, str, len);
                buffer[len]=0;

                p = buffer + len - 1;
                while( (p != buffer) && ((*p > 0x00) && (*p <= ' ')) )
                    *(p--) = 0;
                p = buffer;
                while( (*p > 0x00) && (*p <= ' ') )
                    p++;
                strcpy(str, p);
                free(buffer);
            }
        }
    }
    return str;

}

int GetData(struct _db_person *pps)
{
    char strage[20];

    memset(pps, 0, sizeof(struct _db_person));
    printf("enter name: ");
    fgets(pps->name,sizeof(pps->name),stdin);
    trim(pps->name);
    if( strlen(pps->name) == 0 )
        return -1;
    printf("enter card no: ");
    fgets(pps->card,sizeof(pps->card),stdin);
    trim(pps->card);
    if( strlen(pps->card) == 0 )
        return -2;
    printf("enter age: ");
    fgets(strage,sizeof(strage),stdin);
    trim(strage);
    if( strlen(strage) == 0 )
        return -3;
    pps->age = atoi(strage);

    return 0;
}

int main(void)
{
    $struct _db_person dbps;

    $database exec01;
    if( SQLCODE != 0 )
    {
        printf("open demo1 failure,SQLCODE=%d
",SQLCODE);
        return -1;
    }
    while( 1 )
    {
        if( GetData(&dbps)<0 )
            break;
        $insert into person(name, card, age) values($dbps.name, $dbps.card, $dbps.age);
        printf("insert data result: SQLCODE=%d
",SQLCODE);
        $declare vcursor cursor for select name, card, age into $dbps.name, $dbps.card, $dbps.age from person;
        printf("declare vcursor result: SQLCODE=%d
",SQLCODE);
        $open vcursor;
        printf("open vcursor result: SQLCODE=%d
",SQLCODE);
        if( 0==SQLCODE )
        {
            while( 1 )
            {
                $fetch vcursor;
                if( 0==SQLCODE )
                {
                    printf("name=[%s],card=[%s],age=[%d]
",dbps.name,dbps.card,dbps.age);
                }
                else
                {
                    if( SQLCODE==100 )
                        printf("fetch end!
");
                    else
                        printf("fetch failure!SQLCODE=%d
",SQLCODE);
                    break;
                }
            }
        }
        $close vcursor;
        $free vcursor;
    }
    $disconnect current;

    return 0;
}

プログラムは簡単なCにinformixデータベースを埋め込み、ソースファイルは.ecファイル、コンパイラはesql、ヘッダファイルディレクトリ:$(INFORMIXDIR)/include、管理ツールdbaccess、使用法:dbaccess[dbname]、dbschema、使用法:dbschema[-t tabname]Cd dbname[filename]
1.前処理プログラムによる.ecファイル生成.cファイル
2.システムにより指定されたコンパイラ.cファイルをobjファイルにコンパイル
3、システム接続プログラムによりobjファイルと静的ライブラリファイルを接続し、実行可能ファイルを生成する
したがって、$CCに適切なコンパイラ、gccまたはg++を指定する必要があります.
linuxでinformixをインストールして環境変数を追加
LD_LIBRARY_PATH=$INFORMIXDIR/lib:$/INFORMIXDIR/lib/esql:$LD_LIBRARY_PATH;
export LD_LIBRARY_PATH;
 
プログラミング
 
ヘッダファイルを含む:EXEC SQL include"dbdef.h";
事前定義変数:EXEC SQL define MAXLEN 64;
変数の定義:
    EXEC SQL BEGIN DECLARE SECTION;
        char Fname[MAXLEN+1];
    EXEC SQL END DECLARE SECTION;
データベースを開く:
    EXEC SQL connect to ‘dbname';
データベースを閉じる:
    EXEC SQL disconnect current;
cursorの定義
    EXEC SQL declare cursorname cursor for select……
cursorを開く
    EXEC SQL open cursorname;
データの読み込み
    EXEC SQL fetch cursorname;
操作が成功したかどうかを判断する
    SQLCODE==0
データが終了したかどうかを判断する
    if( SQLCODE==100);
 
あるいは次のようになります.
 
  
$include “appdef.h”;

$define MAXLEN  64;

$char Fname[MAXLEN+1];

$database dccdb;

$declare cursorname cursor for select……;

$open cursorname;

$fetch cursorname;

$close cursorname;

$free cursorname;

$disconnect current


 
次はmakefileの作成です.必ずライブラリ関数をリンクしてください.そうしないとエラーになります.
 
  
CC=gcc
exec01: exec01.o
    esql -o exec01 -L$(INFORMIXDIR)/lib exec01.o
exec01.o:
    esql -c -I$(INFORMIXDIR)/incl/esql exec01.ec
clean:
    rm -f exec01 *.o exec01.c exec01