Archive for 4月, 2012
-
Hello, Win32 API(CUI) World!
Posted on 4月 11th, 2012 by cx20
Win32 API(CUI)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
ソースコード
#include <windows.h> #include <tchar.h> int _tmain( int argc, TCHAR* argv[] ) { HANDLE hStdOutput; DWORD dwSize; TCHAR szBuf[256]; lstrcpy( szBuf, _T("Hello, Win32 API(CUI) World!n") ); hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE ); WriteConsole( hStdOutput, szBuf, lstrlen(szBuf), &dwSize, NULL ); return 0; }
コンパイル方法(Visual C++)
C:¥> cl hello.c /link /SUBSYSTEM:CONSOLE
実行結果
Hello, Win32 API(CUI) World!
-
Hello, JNI World!
Posted on 4月 10th, 2012 by cx20
JNI
JNA(Java Native Interface)は、Java と他の言語のインターフェイス仕様である。
Java から C言語のライブラリの呼び出し、また、C言語から Java のライブラリの呼び出し等が可能である。
ここでは、C言語から Java のライブラリの呼び出しのサンプルを記載する。ソースコード(呼び出す側(C++))
#include <jni.h> int main( int argc, char* argv[] ) { JNIEnv* env; JavaVM* jvm; // Java VM オプション設定 JavaVMOption options[1]; options[0].optionString = "-Xmx128m"; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 1; // Java VM 作成 JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); // Class 検索 jclass clazz = env->FindClass("Hello"); // Method ID 取得 jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); // Class メソッド呼び出し env->CallStaticVoidMethod(clazz, mid, NULL); // Java VM 破棄 jvm->DestroyJavaVM(); return 0; }
ソースコード(呼び出される側(Java))
public class Hello { public static void main( String[] args ) { System.out.println( "Hello, JNI World!" ); } }
コンパイル&実行方法
$ javac Hello.java $ c++ -o jnihello jnihello.cpp ¥ -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ ¥ -framework JavaVM ¥ -m64 $ ./jnihello
実行結果
Hello, JNI World!
-
Hello, JNA World!
Posted on 4月 9th, 2012 by cx20
JNA
JNA(Java Native Access)は、Java から C言語などの共有ライブラリにアクセスするライブラリである。
ソースコード
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class Hello { public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary(Platform.isWindows() ? "msvcrt" : "c", CLibrary.class); void printf(String format, Object... args); } public static void main(String[] args) { CLibrary c = CLibrary.INSTANCE; c.printf("Hello, JNA World!n"); } }
コンパイル&実行方法
$ javac -cp jna.jar:platform.jar:. Hello.java $ java -cp jna.jar:platform.jar:. Hello
実行結果
Hello, JNA World!
-
Hello, LINQ World!
Posted on 4月 8th, 2012 by cx20
LINQ
LINQ(Language Integrated Query : 統合言語クエリ)は、.NET 言語から DBMS や XML にアクセスする為の汎用クエリ機能である。
LINQ プロバイダとして、以下のようなものがある。LINQ プロバイダ 説明 LINQ to SQL SQL Server LINQ to XML XML ドキュメント LINQ to Dataset ADO.NET データセット LINQ to Objects .NET コレクション、ファイル、文字列など ソースコード(C# + LINQ to Objects)
using System; using System.Linq; using System.Collections.Generic; class Record { public string Message; public Record(string message) { this.Message = message; } } class Hello { static void Main(string[] args) { Record[] records = new Record[] { new Record("Hello, LINQ World!") }; IEnumerable<Record> query = from n in records select n; foreach (Record r in query) { Console.WriteLine(r.Message); } } }
ソースコード(C# + LINQ to SQL)
/** -- <事前準備> -- 1. テーブル作成 CREATE TABLE HELLO ( ID INT NOT NULL, MESSAGE VARCHAR(50) NULL, PRIMARY KEY (ID) ); -- 2. データ投入 INSERT HELLO ( ID, MESSAGE ) VALUES ( 1, 'Hello, LINQ World' ); -- 3. データ表示 SELECT * FROM HELLO; -- ------------------ ID MESSAGE -- ------------------ 1 Hello, LINQ World! -- ------------------ */ using System; using System.Linq; using System.Data.Linq; using System.Data.Linq.Mapping; public class HelloDataContext : DataContext { public HelloDataContext(string connectionString) : base(connectionString) { } public Table<HelloTable> Hello; } [Table(Name = "Hello")] public class HelloTable { [Column(IsPrimaryKey = true)] public int Id; [Column] public string Message; } class Hello { static void Main(string[] args) { string conStr = "SERVER=(local);" + "DATABASE=Hello;" + "UID=sa;" + "PWD=P@ssW0rd"; var db = new HelloDataContext( conStr ); var q = from h in db.Hello select h; foreach (var h in q) { Console.WriteLine(h.Message); } } }
ソースコード(VB.NET + LINQ to SQL)
''' -- <事前準備> ''' -- 1. テーブル作成 ''' CREATE TABLE HELLO ''' ( ''' ID INT NOT NULL, ''' MESSAGE VARCHAR(50) NULL, ''' PRIMARY KEY (ID) ''' ); ''' -- 2. データ投入 ''' INSERT HELLO ( ID, MESSAGE ) VALUES ( 1, 'Hello, LINQ World' ); ''' -- 3. データ表示 ''' SELECT * FROM HELLO; ''' -- ------------------ ''' ID MESSAGE ''' -- ------------------ ''' 1 Hello, LINQ World! ''' -- ------------------ Imports System Imports System.Linq Imports System.Data.Linq Imports System.Data.Linq.Mapping Public Class HelloDataContext Inherits DataContext Public Sub New( ByVal connectionString As String ) MyBase.New(connectionString) End Sub Public Hello As Table( Of HelloTable ) End Class <Table(Name := "Hello")> _ Public Class HelloTable <Column(IsPrimaryKey := True)> _ Public Id As Integer <Column()> _ Public Message As String End Class Class Hello Shared Sub Main() Dim conStr As String = "SERVER=(local);" _ & "DATABASE=Hello;" _ & "UID=sa;" _ & "PWD=P@ssW0rd" Dim db = New HelloDataContext( conStr ) Dim q = from h In db.Hello Select h For Each h In q Console.WriteLine(h.Message) Next End Sub End Class
コンパイル方法(C# + LINQ to Objects)
C:¥> csc Hello.cs
コンパイル方法(C# + LINQ to SQL)
C:¥> csc Hello.cs
コンパイル方法(VB.NET + LINQ to SQL)
C:¥> vbc Hello.vb
実行結果
Hello, LINQ World!
-
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!
-
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!
-
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!
-
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!
-
Hello, ODP.NET World!
Posted on 4月 3rd, 2012 by cx20
ODP.NET
ODP.NET(Oracle Data Provider for .NET)は、.NET ベースの Oracle Database 接続用 API である。ODAC(Oracle Data Access Component)と呼ばれるパッケージに含まれる。
.NET 環境での Oracle Database 用データプロバイダとしては、マイクロソフト社が提供する「Microsoft Oracle Client」とオラクル社が提供する「ODP.NET」があるが、現在、「Microsoft Oracle Client」はマイクロソフト社自身が非推奨としており、今後は ODP.NET の使用が推奨されている。データプロバイダ 説明 System.Data.OracleClient .NET Framework Data Provider for Oracle Oracle.DataAccess.Client Oracle Data Provider for .NET ソースコード(C# + ODP.NET + Oracle)
using System; using Oracle.DataAccess.Client; class Hello { static void Main( String[] args ) { string conStr = "Data Source=ORCL;" + "User Id=scott;" + "Password=tiger"; string sqlStr = "SELECT 'Hello, ODP.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#)
C:¥> csc /r:Oracle.DataAccess.dll Hello.cs
実行結果
MESSAGE --------------------- Hello, ODP.NET World!
-
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!