Archive for the ‘SQL’ Category

  1. Hello, SQLJ World!

    Posted on 4月 7th, 2012 by cx20

    SQLJ

    SQLJ は Oracle Database に対応した Java 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*C/C++、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。
    なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

    ソースコード(SQLJ)

    import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    #sql iterator MessageIter ( String MESSAGE );
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL };
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }

    上記コードは、SQLJ トランスレータ により、以下の Java のコードが生成される。

    ソースコード(Java)

    /*@lineinfo:filename=Hello*//*@lineinfo:user-code*//*@lineinfo:1^1*/import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    /*@lineinfo:generated-code*//*@lineinfo:4^1*/
     
    //  ************************************************************
    //  SQLJ iterator declaration:
    //  ************************************************************
     
    class MessageIter
    extends sqlj.runtime.ref.ResultSetIterImpl
    implements sqlj.runtime.NamedIterator
    {
      public MessageIter(sqlj.runtime.profile.RTResultSet resultSet)
        throws java.sql.SQLException
      {
        super(resultSet);
        MESSAGENdx = findColumn("MESSAGE");
        m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
      }
      private oracle.jdbc.OracleResultSet m_rs;
      public String MESSAGE()
        throws java.sql.SQLException
      {
        return (String)m_rs.getString(MESSAGENdx);
      }
      private int MESSAGENdx;
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:4^44*/
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            /*@lineinfo:generated-code*//*@lineinfo:10^9*/
     
    //  ************************************************************
    //  #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL  };
    //  ************************************************************
     
    {
      // declare temps
      oracle.jdbc.OraclePreparedStatement __sJT_st = null;
      sqlj.runtime.ref.DefaultContext __sJT_cc = sqlj.runtime.ref.DefaultContext.getDefaultContext(); if (__sJT_cc==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
      sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = ((__sJT_cc.getExecutionContext()==null) ? sqlj.runtime.ExecutionContext.raiseNullExecCtx() : __sJT_cc.getExecutionContext().getOracleContext());
      try {
       String theSqlTS = "SELECT 'Hello, SQLJ World!' AS Message FROM DUAL";
       __sJT_st = __sJT_ec.prepareOracleStatement(__sJT_cc,"0MessageIter",theSqlTS);
       // execute query
       iter = new MessageIter(new sqlj.runtime.ref.OraRTResultSet(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MessageIter",null));
      } finally { __sJT_ec.oracleCloseQuery(); }
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:10^72*/
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }/*@lineinfo:generated-code*/

    コンパイル&実行方法

    C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
    C:¥> SET CLASSPATH=ORACLE_BASEORACLE_HOMEsqljlibruntime12.jar;
         ORACLE_BASEORACLE_HOMEsqljlibtranslator.jar;
         ORACLE_BASEORACLE_HOMEjdbclibojdbc6.jar;%CLASSPATH%
    C:¥> sqlj Hello.sqlj
    C:¥> java Hello

    実行結果

    Hello, SQLJ World!
  2. Hello, JDBC Type4 World!

    Posted on 4月 6th, 2012 by cx20

    JDBC Type4

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type4 は DBMS のクライアントライブラリを使用しない Pure Java の DBMS ドライバである。

    ソースコード(Java + JDBC Type4 + SQL Server)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection conn = DriverManager.getConnection("jdbc:sqlserver://;serverName=localhost", "sa", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + SQL Server)

    C:¥> javac Hello.java
    C:¥> java -cp "sqljdbc4.jar;." Hello

    ソースコード(Java + JDBC Type4 + Oracle)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + Oracle)

    C:¥> javac Hello.java
    C:¥> java -cp "ojdbc6.jar;." Hello

    ソースコード(Java + JDBC Type4 + MySQL)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + MySQL)

    C:¥> javac Hello.java
    C:¥> java -cp "mysql-connector-java-5.1.22-bin.jar;." Hello

    実行結果

    Hello, JDBC Type4 World!
  3. Hello, JDBC Type2 World!

    Posted on 4月 5th, 2012 by cx20

    JDBC Type2

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type2 は JDBC と DBMS クライアントの API をマップさせたブリッジドライバである。
    例えば、Oracle であればクライアントライブラリとして OCI が使用される。

    ソースコード(Java + JDBC Type2 + Oracle)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@orcl", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type2 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> java -cp "ojdbc6.jar;." Hello

    実行結果

    Hello, JDBC Type2 World!
  4. Hello, JDBC Type1 World!

    Posted on 4月 4th, 2012 by cx20

    JDBC Type1

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type1 は JDBC と ODBC の API をマップさせたブリッジドライバである。

    ソースコード(Java + JDBC Type1 + ODBC + Jet データベース)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "", "");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb", "", "");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + ACE データベース)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "", "");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb", "", "");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + SQL Server)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "sa", "P@ssW0rd");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={SQL Server};SERVER=(local)", "sa", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + Oracle)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "scott", "tiger");
            // ODBC 接続文字列を使用したケース1(MS 製 ODBC ドライバ)
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft ODBC for Oracle};Data Source=ORCL", "scott", "tiger");
            // ODBC 接続文字列を使用したケース2(Oracle 製 ODBC ドライバ)
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + MySQL)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "root", "P@ssW0rd");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={MySQL ODBC 5.1 Driver};Server=localhost", "root", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> java Hello

    実行結果

    Hello, JDBC Type1 World!
  5. Hello, oo4o World!

    Posted on 4月 2nd, 2012 by cx20

    oo4o

    oo4o(Oracle Objects for OLE)は、COM ベースの Oracle Database 接続用 API である。
    Windows 環境で VB による開発に用いられることが多い。

    ソースコード(VBScript + oo4o + Oracle)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim ses
        Dim db
        Dim rs
        Set ses = CreateObject("OracleInProcServer.XOraSession")
        Set db = ses.OpenDatabase( "ORCL", "scott/tiger", 0 )
        Set rs = db.CreateDynaset( "SELECT 'Hello, oo4o World!' AS Message FROM DUAL", 4)
        While NOT rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
       Wend
    End Sub

    実行方法(Windows)

    C:¥> CScript //Nologo Hello.vbs

    実行結果

    MESSAGE
    ------------------
    Hello, oo4o World!
  6. Hello, Pro*C/C++ World!

    Posted on 4月 1st, 2012 by cx20

    Pro*C/C++

    Pro*C/C++ は Oracle Database に対応した C/C++ 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。Pro*C/C++ は、UNIX 環境で C/C++ を用いた開発に使用されることが多い。
    なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

    ソースコード

    #include <stdio.h>
     
    EXEC SQL INCLUDE SQLCA;
     
    int main( int argc, char* argv[] )
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char username[] = "scott";
        char password[] = "tiger";
        char message[32];
        EXEC SQL END DECLARE SECTION;
        EXEC SQL CONNECT :username IDENTIFIED BY :password;
        EXEC SQL DECLARE C1 CURSOR FOR
            SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL;
        EXEC SQL OPEN C1;
        EXEC SQL WHENEVER NOT FOUND DO BREAK;
        for (;;)
        {
            EXEC SQL FETCH C1 INTO :message;
            printf("Messagen");
            printf("-----------------------n");
            printf("%sn", message);
        }
        EXEC SQL CLOSE C1;
        EXEC SQL COMMIT RELEASE;
        return 0;
    }

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

    ソースコード

    /* Result Sets Interface */
    #ifndef SQL_CRSR
    #  define SQL_CRSR
      struct sql_cursor
      {
        unsigned int curocn;
        void *ptr1;
        void *ptr2;
        unsigned int magic;
      };
      typedef struct sql_cursor sql_cursor;
      typedef struct sql_cursor SQL_CURSOR;
    #endif /* SQL_CRSR */
    /* Thread Safety */
    typedef void * sql_context;
    typedef void * SQL_CONTEXT;
    /* Object support */
    struct sqltvn
    {
      unsigned char *tvnvsn; 
      unsigned short tvnvsnl; 
      unsigned char *tvnnm;
      unsigned short tvnnml; 
      unsigned char *tvnsnm;
      unsigned short tvnsnml;
    };
    typedef struct sqltvn sqltvn;
    struct sqladts
    {
      unsigned int adtvsn; 
      unsigned short adtmode; 
      unsigned short adtnum;  
      sqltvn adttvn[1];       
    };
    typedef struct sqladts sqladts;
    static struct sqladts sqladt = {
      1,1,0,
    };
    /* Binding to PL/SQL Records */
    struct sqltdss
    {
      unsigned int tdsvsn; 
      unsigned short tdsnum; 
      unsigned char *tdsval[1]; 
    };
    typedef struct sqltdss sqltdss;
    static struct sqltdss sqltds =
    {
      1,
      0,
    };
    /* File name & Package Name */
    struct sqlcxp
    {
      unsigned short fillen;
               char  filnam[9];
    };
    static const struct sqlcxp sqlfpn =
    {
        8,
        "hello.pc"
    };
    static unsigned int sqlctx = 18323;
    static struct sqlexd {
       unsigned int   sqlvsn;
       unsigned int   arrsiz;
       unsigned int   iters;
       unsigned int   offset;
       unsigned short selerr;
       unsigned short sqlety;
       unsigned int   occurs;
          const short *cud;
       unsigned char  *sqlest;
          const char  *stmt;
       sqladts *sqladtp;
       sqltdss *sqltdsp;
                void  **sqphsv;
       unsigned int   *sqphsl;
                int   *sqphss;
                void  **sqpind;
                int   *sqpins;
       unsigned int   *sqparm;
       unsigned int   **sqparc;
       unsigned short  *sqpadto;
       unsigned short  *sqptdso;
       unsigned int   sqlcmax;
       unsigned int   sqlcmin;
       unsigned int   sqlcincr;
       unsigned int   sqlctimeout;
       unsigned int   sqlcnowait;
                  int   sqfoff;
       unsigned int   sqcmod;
       unsigned int   sqfmod;
                void  *sqhstv[4];
       unsigned int   sqhstl[4];
                int   sqhsts[4];
                void  *sqindv[4];
                int   sqinds[4];
       unsigned int   sqharm[4];
       unsigned int   *sqharc[4];
       unsigned short  sqadto[4];
       unsigned short  sqtdso[4];
    } sqlstm = {12,4};
    /* SQLLIB Prototypes */
    extern void sqlcxt (void **, unsigned int *,
                        struct sqlexd *, const struct sqlcxp *);
    extern void sqlcx2t(void **, unsigned int *,
                        struct sqlexd *, const struct sqlcxp *);
    extern void sqlbuft(void **, char *);
    extern void sqlgs2t(void **, char *);
    extern void sqlorat(void **, unsigned int *, void *);
    /* Forms Interface */
    static const int IAPSUCC = 0;
    static const int IAPFAIL = 1403;
    static const int IAPFTL  = 535;
    extern void sqliem(unsigned char *, signed int *);
     static const char *sq0002 = 
    "select 'Hello, Pro*C World!' Message  from DUAL            ";
    typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
    typedef struct { unsigned short len; unsigned char arr[1]; } varchar;
    /* cud (compilation unit data) array */
    static const short sqlcud0[] =
    {12,4130,838,0,0,
    5,0,0,0,0,0,27,12,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,10,0,0,1,10,0,0,
    36,0,0,2,59,0,9,15,0,0,0,0,0,1,0,
    51,0,0,2,0,0,13,19,0,0,1,0,0,1,0,2,97,0,0,
    70,0,0,2,0,0,15,24,0,0,0,0,0,1,0,
    85,0,0,3,0,0,30,25,0,0,0,0,0,1,0,
    };
    #include <stdio.h>
    /* EXEC SQL INCLUDE SQLCA;
     */ 
     
    #ifndef SQLCA
    #define SQLCA 1
     
    struct   sqlca
             {
             /* ub1 */ char    sqlcaid[8];
             /* b4  */ int     sqlabc;
             /* b4  */ int     sqlcode;
             struct
               {
               /* ub2 */ unsigned short sqlerrml;
               /* ub1 */ char           sqlerrmc[70];
               } sqlerrm;
             /* ub1 */ char    sqlerrp[8];
             /* b4  */ int     sqlerrd[6];
             /* ub1 */ char    sqlwarn[8];
             /* ub1 */ char    sqlext[8];
             };
    #ifndef SQLCA_NONE 
    #ifdef   SQLCA_STORAGE_CLASS
    SQLCA_STORAGE_CLASS struct sqlca sqlca
    #else
             struct sqlca sqlca
    #endif
     
    #ifdef  SQLCA_INIT
             = {
             {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
             sizeof(struct sqlca),
             0,
             { 0, {0}},
             {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
             {0, 0, 0, 0, 0, 0},
             {0, 0, 0, 0, 0, 0, 0, 0},
             {0, 0, 0, 0, 0, 0, 0, 0}
             }
    #endif
             ;
    #endif
     
    #endif
     
    /* end SQLCA */
    int main( int argc, char* argv[] )
    {
        /* EXEC SQL BEGIN DECLARE SECTION; */ 
        char username[] = "scott";
        char password[] = "tiger";
        char message[32];
        /* EXEC SQL END DECLARE SECTION; */ 
        /* EXEC SQL CONNECT :username IDENTIFIED BY :password; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )10;
        sqlstm.offset = (unsigned int  )5;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlstm.sqhstv[0] = (         void  *)username;
        sqlstm.sqhstl[0] = (unsigned int  )0;
        sqlstm.sqhsts[0] = (         int  )0;
        sqlstm.sqindv[0] = (         void  *)0;
        sqlstm.sqinds[0] = (         int  )0;
        sqlstm.sqharm[0] = (unsigned int  )0;
        sqlstm.sqadto[0] = (unsigned short )0;
        sqlstm.sqtdso[0] = (unsigned short )0;
        sqlstm.sqhstv[1] = (         void  *)password;
        sqlstm.sqhstl[1] = (unsigned int  )0;
        sqlstm.sqhsts[1] = (         int  )0;
        sqlstm.sqindv[1] = (         void  *)0;
        sqlstm.sqinds[1] = (         int  )0;
        sqlstm.sqharm[1] = (unsigned int  )0;
        sqlstm.sqadto[1] = (unsigned short )0;
        sqlstm.sqtdso[1] = (unsigned short )0;
        sqlstm.sqphsv = sqlstm.sqhstv;
        sqlstm.sqphsl = sqlstm.sqhstl;
        sqlstm.sqphss = sqlstm.sqhsts;
        sqlstm.sqpind = sqlstm.sqindv;
        sqlstm.sqpins = sqlstm.sqinds;
        sqlstm.sqparm = sqlstm.sqharm;
        sqlstm.sqparc = sqlstm.sqharc;
        sqlstm.sqpadto = sqlstm.sqadto;
        sqlstm.sqptdso = sqlstm.sqtdso;
        sqlstm.sqlcmax = (unsigned int )100;
        sqlstm.sqlcmin = (unsigned int )2;
        sqlstm.sqlcincr = (unsigned int )1;
        sqlstm.sqlctimeout = (unsigned int )0;
        sqlstm.sqlcnowait = (unsigned int )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL DECLARE C1 CURSOR FOR
            SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL; */ 
        /* EXEC SQL OPEN C1; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.stmt = sq0002;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )36;
        sqlstm.selerr = (unsigned short)1;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlstm.sqcmod = (unsigned int )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL WHENEVER NOT FOUND DO BREAK; */ 
        for (;;)
        {
            /* EXEC SQL FETCH C1 INTO :message; */ 
    {
            struct sqlexd sqlstm;
            sqlstm.sqlvsn = 12;
            sqlstm.arrsiz = 4;
            sqlstm.sqladtp = &sqladt;
            sqlstm.sqltdsp = &sqltds;
            sqlstm.iters = (unsigned int  )1;
            sqlstm.offset = (unsigned int  )51;
            sqlstm.selerr = (unsigned short)1;
            sqlstm.cud = sqlcud0;
            sqlstm.sqlest = (unsigned char  *)&sqlca;
            sqlstm.sqlety = (unsigned short)4352;
            sqlstm.occurs = (unsigned int  )0;
            sqlstm.sqfoff = (           int )0;
            sqlstm.sqfmod = (unsigned int )2;
            sqlstm.sqhstv[0] = (         void  *)message;
            sqlstm.sqhstl[0] = (unsigned int  )32;
            sqlstm.sqhsts[0] = (         int  )0;
            sqlstm.sqindv[0] = (         void  *)0;
            sqlstm.sqinds[0] = (         int  )0;
            sqlstm.sqharm[0] = (unsigned int  )0;
            sqlstm.sqadto[0] = (unsigned short )0;
            sqlstm.sqtdso[0] = (unsigned short )0;
            sqlstm.sqphsv = sqlstm.sqhstv;
            sqlstm.sqphsl = sqlstm.sqhstl;
            sqlstm.sqphss = sqlstm.sqhsts;
            sqlstm.sqpind = sqlstm.sqindv;
            sqlstm.sqpins = sqlstm.sqinds;
            sqlstm.sqparm = sqlstm.sqharm;
            sqlstm.sqparc = sqlstm.sqharc;
            sqlstm.sqpadto = sqlstm.sqadto;
            sqlstm.sqptdso = sqlstm.sqtdso;
            sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
            if (sqlca.sqlcode == 1403) break;
    }
            printf("Messagen");
            printf("-----------------------n");
            printf("%sn", message);
        }
        /* EXEC SQL CLOSE C1; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )70;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL COMMIT RELEASE; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )85;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        return 0;
    }

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

    C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEprecomppublic;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEprecomplib;%LIB%
    C:¥> proc hello.pc
    C:¥> cl hello.c /link orasql11.lib

    実行結果

    Message
    -----------------------
    Hello, Pro*C/C++ World!
    
  7. Hello, OLE DB(C++) World!

    Posted on 3月 27th, 2012 by cx20

    OLE DB(C++)

    OLE DB(Object Linking and Embedding Database)は、マイクロソフトが提唱した COM(Component Object Model)ベースの API 仕様である。
    OLE DB の概念は「OLE DB プロバイダ」(データ提供者)と「OLE DB コンシューマ」(データ消費者)からなる。(サーバーやクライアントという用語を使わないのは、n 層の場合に、必ずしもその意味にならない為。)
    データソースの差異は OLE DB プロバイダによって吸収される為、OLE DB コンシューマの手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。
    OLE DB プロバイダとしては、以下のようなプロバイダがある。

    プロバイダ名 表示名 説明
    MSDASQL Microsoft OLE DB Provider for ODBC ODBC データベース
    Microsoft.Jet.OLEDB.4.0 Microsoft OLE DB Provider for Microsoft Jet Microsoft Jet データベース
    Microsoft.ACE.OLEDB.12.0 Microsoft Office 12.0 Access Database Engine OLE DB Provider Microsoft Access データベース
    SQLOLEDB Microsoft OLE DB Provider for SQL Server Microsoft SQL Server
    SQLNCLI10 SQL Server Native Client 10.0 Microsoft SQL Server
    MSDAORA Microsoft OLE DB Provider for Oracle Oracle データベース

    ソースコード(VC + OLE DB + Jet データベース)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=hello.mdb";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + ACE データベース)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicStringAccessor> cmd;
     
        WCHAR szCon[] = L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=hello.accdb";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        cmd.Open( ses, szSQL );
     
        while( cmd.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( cmd.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)cmd.GetString(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + SQL Server)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"PROVIDER=SQLOLEDB;SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + Oracle)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"PROVIDER=MSDAORA;Data Source=ORCL;User ID=scott;Password=tiger";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message FROM DUAL";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Message
    --------------------
    Hello, OLE DB World!
  8. Hello, DAO(MFC) World!

    Posted on 3月 26th, 2012 by cx20

    DAO(MFC)

    MFC(Microsoft Foundation Class)は、Visual C++ 用のクラスライブラリである。
    MFC DAO クラスは、DAO(Data Access Object)のラップクラスとして実装されている。
    現在、DAO クラスは既存のアプリケーションの保守の為だけに残されており、新しいプロジェクトでは ODBC クラスが推奨されている。
    なお、x64 プラットフォームでは DAO クラスはサポートされておらず、コンパイルエラーとなる。

    ソースコード(VC + MFC + DAO + Jet データベース)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T("hello.mdb") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + DAO + ODBC + SQL Server)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T(""), FALSE, FALSE, 
            _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + DAO + ODBC + Oracle)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T(""), FALSE, FALSE, 
            _T("ODBC;Driver={Oracle in OraDb11g_home1};DBQ=ORCL;UID=scott;PWD=tiger;") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Hello, DAO(MFC) World!
  9. Hello, ODBC(MFC) World!

    Posted on 3月 25th, 2012 by cx20

    ODBC(MFC)

    ODBC(Open Database Connectivity)は、マイクロソフト社が提唱した DBMS 接続用の API 仕様である。
    DBMS の差異は ODBC ドライバによって吸収される為、ODBC の手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。

    ODBCドライバ ファイル
    Microsoft Access Driver (*.mdb) ODBCJT32.DLL
    Microsoft Text Driver (*.txt; *.csv) ODBCJT32.DLL
    Microsoft Excel Driver (*.xls) ODBCJT32.DLL
    Microsoft dBase Driver (*.dbf) ODBCJT32.DLL
    Microsoft ODBC for Oracle MSORCL32.DLL
    Microsoft Paradox Driver (*.db ) ODBCJT32.DLL
    SQL Server SQLSRV32.DLL
    Microsoft Access Driver (*.mdb, *.accdb) ACEODBC.DLL
    SQL Server Native Client 10.0 SQLNCLI10.DLL

    MFC ODBC クラス は、Visual C++ の ODBC クラスライブラリである。

    ソースコード(VC + MFC + ODBC + Jet データベース)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + ACE データベース)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb");
        CString strSQL = _T("SELECT 'Hello, ODBC World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + SQL Server)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + Oracle)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft ODBC for Oracle};SERVER=ORCL;UID=scott;PWD=tiger");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message FROM DUAL");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + MySQL)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Message
    Hello, ODBC(MFC) World!
  10. Hello, ADO.NET World!

    Posted on 3月 24th, 2012 by cx20

    ADO.NET

    ADO.NET(ActiveX Data Objects .NET)は、ADO の後継で .NET ベースの DBMS 接続用 API である。
    .NET データプロバイダを介することで様々な DBMS への接続が可能となっている。
    .NET Framework 標準で使用できる .NET データプロバイダとしては、以下のようなプロバイダがある。

    データプロバイダ名 説明
    System.Data.SqlClient Microsoft SQL Server
    System.Data.OleDb OLE DB
    System.Data.Odbc ODBC
    System.Data.OracleClient Oracle

    ソースコード(C# + ADO.NET + OLE DB + Jet データベース)

    using System;
    using System.Data.OleDb;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
                + "Data Source=hello.mdb";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OleDbConnection con = new OleDbConnection(conStr);
            OleDbCommand  cmd = new OleDbCommand(sqlStr, con);
            con.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + OLE DB + ACE データベース)

    using System;
    using System.Data.OleDb;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;"
                + "Data Source=.\hello.accdb";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OleDbConnection con = new OleDbConnection(conStr);
            OleDbCommand  cmd = new OleDbCommand(sqlStr, con);
            con.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + SQL Server)

    using System;
    using System.Data.SqlClient;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "SERVER=(local);"
                + "DATABASE=master;"
                + "UID=sa;"
                + "PWD=P@ssW0rd";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand(sqlStr, con);
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + Oracle)

    using System;
    using System.Data.OracleClient;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Data Source=ORCL;User ID=scott;Password=tiger";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message FROM DUAL";
     
            OracleConnection con = new OracleConnection(conStr);
            OracleCommand cmd = new OracleCommand(sqlStr, con);
            con.Open();
            OracleDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + ODBC + MySQL)

    using System;
    using System.Data.Odbc;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OdbcConnection con = new OdbcConnection(conStr);
            OdbcCommand  cmd = new OdbcCommand(sqlStr, con);
            con.Open();
            OdbcDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    コンパイル方法(32bit OLE DB 使用時)

    C:¥> csc Hello.cs /platform:x86

    コンパイル方法(上記以外)

    C:¥> csc Hello.cs

    実行結果

    Message
    ---------------------
    Hello, ADO.NET World!