Archive for the ‘C言語’ Category
-
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!
-
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!
-
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!
-
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:¥> cl hello.c
実行結果
Hello, C World!