Archive for the ‘C言語’ Category

  1. Hello, ESQL/C World!

    Posted on 3月 20th, 2012 by cx20

    ESQL/C

    ESQL は埋め込み SQL(Embedded SQL)とも呼ばれ、手続型プログラミング言語(ホスト言語)に SQL を埋め込む方式のことを言う。埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。
    ESQL/C は、ホスト言語に C言語を対象としており、SQL Server の他、いくつかの DBMS で採用している。なお、Oracle Database 用の 埋め込みSQL は Pro*C と呼ばれる。
    SQL Server 用の ESQL/C では、ESQL プリプロセッサにより「.sqc」ファイルから「*.c」ファイルを生成する。

    ソースコード(ESQL)

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char szServerDatabase[] = "(local).pubs";
        char szLoginPassword[] = "sa.P@ssW0rd";
        char szCommand[] = "SELECT 'Hello, ESQL/C World!' AS Message";
        char message[32] = { 0 };
        EXEC SQL END DECLARE SECTION;
        EXEC SQL CONNECT TO :szServerDatabase USER :szLoginPassword;
        EXEC SQL DECLARE C1 CURSOR FOR stmt;
        EXEC SQL PREPARE stmt FROM :szCommand;
        EXEC SQL OPEN C1;
        while ( SQLCODE == 0 )
        {
            EXEC SQL FETCH C1 INTO :message;
            if ( SQLCODE == 0 )
            {
                printf( "Messagen" );
                printf( "--------------------n" );
                printf( "%sn", message );
            }
        }
        EXEC SQL CLOSE C1;
        EXEC SQL DISCONNECT ALL;
        return 0;
    }

    上記コードは、ESQL プリプロセッサにより、以下の C言語のコードが生成される。

    ソースコード(C言語)

    /* ===== hello.c =====*/
    /* ===== NT doesn't need the following... */
    #ifndef WIN32
    #define WIN32
    #endif
    #define _loadds
    #define _SQLPREP_
    #include <sqlca.h>
    #include <sqlda.h>
    #include <string.h>
    #define SQLLENMAX(x)      ( ((x) > 32767) ? 32767 : (x) )
    short ESQLAPI _loadds sqlaaloc(
    	unsigned short usSqlDaId,
    	unsigned short sqld,
    	unsigned short stmt_id,
    	void far *spare);
    short ESQLAPI _loadds sqlxcall(
    	unsigned short usCallType,
    	unsigned short usSection,
    	unsigned short usSqldaInId,
    	unsigned short usSqlDaOutId,
    	unsigned short usSqlTextLen,
    	char far *lpszSQLText);
    short ESQLAPI _loadds sqlacall(
    	unsigned short usCallType,
    	unsigned short usSection,
    	unsigned short usSqldaInId,
    	unsigned short usSqlDaOutId,
    	void far *spare);
    short ESQLAPI _loadds sqladloc(
    	unsigned short usSqldaInId,
    	void far *spare);
    short ESQLAPI _loadds sqlasets(
    	unsigned short cbSqlText,
    	void far *lpvSqlText,
    	void far *spare);
    short ESQLAPI _loadds sqlasetv(
    	unsigned short usSqldaInId,
    	unsigned short sqlvar_index,
    	unsigned short sqltype,
    	unsigned short sqllen,
    	void far *sqldata,
    	void far *sqlind,
    	void far *spare);
    short ESQLAPI _loadds sqlastop(
    	void far *spare);
    short ESQLAPI _loadds sqlastrt(
    	void far *pid,
    	void far *spare,
    	void far *sqlca);
    short ESQLAPI _loadds sqlausda(
    	unsigned short sqldaId,
    	void far *lpvSqlDa,
    	void far *spare);
    extern struct tag_sqlca far sql_sqlca;
    extern struct tag_sqlca far *sqlca;
    struct sqla_program_id2 {unsigned short length;unsigned short rp_rel_num;unsigned short db_rel_num;unsigned short bf_rel_num;unsigned char  sqluser[30];unsigned char  sqlusername[30];
    unsigned char  planname[256];unsigned char  contoken[8];unsigned char  buffer[8];};static struct sqla_program_id2 program_id =		{340,2,0,0,"                              ","","hello","AAAvBYD0","        "};
    static void far* pid = &program_id;
    #line 1 "hello.sqc"
    #line 2 "hello.sqc"
    int main( int argc, char* argv[] )
    {
    #line 5
    /*
    EXEC SQL BEGIN DECLARE SECTION;
    */
    #line 5
        char szServerDatabase[] = "(local).pubs";
        char szLoginPassword[] = "sa.P@ssW0rd";
        char szCommand[] = "SELECT 'Hello, ESQL/C World!' AS Message";
        char message[32] = { 0 };
    #line 10
    /*
    EXEC SQL END DECLARE SECTION;
    */
    #line 10
    #line 11
    /*
    EXEC SQL CONNECT TO :szServerDatabase USER :szLoginPassword;
    */
    #line 11
    #line 11
    {
    #line 11
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 11
    	sqlaaloc(2, 2, 1, (void far *)0);
    #line 11
    	sqlasetv(2, 0, 462, (short) SQLLENMAX(sizeof(szServerDatabase)), (void far *)szServerDatabase, (void far *)0, (void far *)0L);
    #line 11
    	sqlasetv(2, 1, 462, (short) SQLLENMAX(sizeof(szLoginPassword)), (void far *)szLoginPassword, (void far *)0, (void far *)0L);
    #line 11
    	sqlxcall(30, 1, 2, 0, 55, (char far *)"  CONNECT TO @p1                USER @p2               ");
    #line 11
    	SQLCODE = sqlca->sqlcode;
    #line 11
    	sqlastop((void far *)0L);
    #line 11
    }
    #line 12
    #line 12
    /*
    EXEC SQL DECLARE C1 CURSOR FOR stmt;
    */
    #line 12
    #line 13
    /*
    EXEC SQL PREPARE stmt FROM :szCommand;
    */
    #line 13
    #line 13
    {
    #line 13
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 13
    	sqlasets((unsigned short)strlen(szCommand), (void far *)szCommand, (void *)0L);
    #line 13
    	sqlacall(27, 2, 0, 0, 0L);
    #line 13
    	SQLCODE = sqlca->sqlcode;
    #line 13
    	sqlastop((void far *)0L);
    #line 13
    }
    #line 14
    #line 14
    /*
    EXEC SQL OPEN C1;
    */
    #line 14
    #line 14
    {
    #line 14
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 14
    	sqlxcall(110, 2, 0, 0, 18, (char far *)"/* C1 2 nohold */ ");
    #line 14
    	SQLCODE = sqlca->sqlcode;
    #line 14
    	sqlastop((void far *)0L);
    #line 14
    }
    #line 15
    #line 14
    {
    #line 14
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 14
    	sqlacall(26, 2, 0, 0, 0L);
    #line 14
    	SQLCODE = sqlca->sqlcode;
    #line 14
    	sqlastop((void far *)0L);
    #line 14
    }
    #line 15
        while ( SQLCODE == 0 )
        {
    #line 17
    /*
    EXEC SQL FETCH C1 INTO :message;
    */
    #line 17
    #line 17
    {
    #line 17
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 17
    	sqlaaloc(1, 1, 2, (void far *)0);
    #line 17
    	sqlasetv(1, 0, 462,(short) SQLLENMAX(sizeof(message)),(void far *)&message, (void far *)0,0L);
    #line 17
    	sqlxcall(25, 2, 0, 1, 26, (char far *)"  FETCH C1 INTO :         ");
    #line 17
    	SQLCODE = sqlca->sqlcode;
    #line 17
    	sqlastop((void far *)0L);
    #line 17
    }
    #line 18
            if ( SQLCODE == 0 )
            {
                printf( "Messagen" );
                printf( "--------------------n" );
                printf( "%sn", message );
            }
        }
    #line 25
    /*
    EXEC SQL CLOSE C1;
    */
    #line 25
    #line 25
    {
    #line 25
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 25
    	sqlxcall(20, 2, 0, 0, 11, (char far *)"  CLOSE C1 ");
    #line 25
    	SQLCODE = sqlca->sqlcode;
    #line 25
    	sqlastop((void far *)0L);
    #line 25
    }
    #line 26
    #line 26
    /*
    EXEC SQL DISCONNECT ALL;
    */
    #line 26
    #line 26
    {
    #line 26
    	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
    #line 26
    	sqlxcall(36, 3, 0, 0, 17, (char far *)"  DISCONNECT ALL ");
    #line 26
    	SQLCODE = sqlca->sqlcode;
    #line 26
    	sqlastop((void far *)0L);
    #line 26
    }
    #line 27
        return 0;
    }
    long SQLCODE;

    コンパイル&リンク方法(Visual C++)

    C:¥> nsqlprep hello.sqc
    C:¥> cl hello.c /link sqlakw32.lib caw32.lib

    実行結果

    Message
    --------------------
    Hello, ESQL/C World!
  2. Hello, DB-Library World!

    Posted on 3月 19th, 2012 by cx20

    DB-Library

    DB-Library は SQL Server 用のネイティブライブラリ(C API)である。
    SQL Server 2000 が最後のリリースとなっており、SQL Server 2005 以降は SQL Server Native Client(OLE DB または ODBC)の使用が推奨されている。

    ソースコード

    #define DBNTWIN32
    #include "windows.h"
     
    #include <sqlfront.h>
    #include <sqldb.h>
    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        DBPROCESS* dbproc;
        LOGINREC*  login;
        char       message[256];
     
        dbinit();
        login = dblogin();
        DBSETLUSER( login, "sa" );
        DBSETLPWD ( login, "P@ssw0rd" );
        dbproc = dbopen( login, "(local)" );
        dbcmd     ( dbproc, "SELECT 'Hello, DB-Library World' AS Message");
        dbsqlexec ( dbproc ); 
        dbresults ( dbproc );
        dbbind    ( dbproc, 1, NTBSTRINGBIND, (DBINT)0, message );
        while( dbnextrow( dbproc ) != NO_MORE_ROWS )
        {
            printf( "Messagen" );
            printf( "-----------------------n" );
            printf( "%sn", message );
        }
        dbexit();
     
        return 0; 
    }

    コンパイル&リンク方法(Visual C++)

    C:¥> cl hello.c /link ntwdblib.lib

    実行結果

    Message
    ------------------------
    Hello, DB-Library World!
  3. Hello, CGI World!

    Posted on 2月 7th, 2012 by cx20

    CGI

    CGI(Common Gateway Interface)は、Web サーバー上でプログラムを動作させる為の仕様の一つである。
    言語としては、C言語 や Perl が主に使われるが、他の言語でも HTTP ヘッダ “Content-Type: text/html¥n¥n” を出力することで、CGI プログラムとして動作させることが可能である。
    CGI 以外の実行方式としてはモジュール形式(Apache や IIS の拡張モジュールとして動作)や FastCGI 形式がある。

    ソースコード(C言語)

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Content-type: text/htmlnn" );
        printf( "<html>n" );
        printf( "  <head>n" );
        printf( "    <title>Hello, World</title>n" );
        printf( "  </head>n" );
        printf( "  <body>n" );
        printf( "    <p>Hello, CGI World!</p>n" );
        printf( "  </body>n" );
        printf( "</html>n" );
        return 0;
    }

    ソースコード(Perl)

    #!/usr/bin/perl
    print "Content-Type: text/htmlnn";
    print "<html>n";
    print "  <head>n";
    print "    <title>Hello, World!</title>n";
    print "  </head>n";
    print "  <body>n";
    print "    <p>Hello, CGI World!</p>n";
    print "  </body>n";
    print "</html>n";

    ソースコード(PHP)

    #!/usr/bin/php
    <html>
      <head>
        <title>Hello, World!</title>
      </head>
      <body>
        <p><?php echo "Hello, CGI World!"; ?></p>
      </body>
    </html>

    実行方法(C言語)

    1. コンパイル
       $ cc -o hello.cgi hello.c
    2. CGI用フォルダ(cgi-bin等)に配置
    3. 実行権限の付与
       $ chmod +x hello.cgi
    4. ブラウザで表示
       http://localhost/cgi-bin/hello.cgi

    実行方法(Perl)

    1. CGI用フォルダ(cgi-bin等)に配置
    2. 実行権限の付与
       $ chmod +x hello.pl
    3. ブラウザで表示
       http://localhost/cgi-bin/hello.pl

    実行方法(PHP)

    1. CGI用フォルダ(cgi-bin等)に配置
    2. 実行権限の付与
       $ chmod +x hello.php
    3. ブラウザで表示
       http://localhost/cgi-bin/hello.php

    実行結果

    Hello, CGI World!
  4. Hello, C World!

    Posted on 12月 1st, 2011 by cx20

    C言語

    C言語は UNIX の移植性を高める為に開発された手続き型の言語である。名前の由来はB言語の後継である為。
    アセンブラのような低レベルな処理が行える為、高級アセンブラと呼ばれることもある。

    ソースコード

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Hello, C World!\n" );
        return 0;
    }
    </stdio.h>

    コンパイル方法(UNIX C コンパイラ)

    $ cc -o hello hello.c

    コンパイル方法(GNU C コンパイラ)

    $ gcc -o hello hello.c

    コンパイル方法(LLVM CLang コンパイラ)

    $ clang -o hello hello.c

    コンパイル方法(Visual C++)

    C:¥&gt; cl hello.c

    実行結果

    Hello, C World!