Archive for the ‘SQL Server’ Category
-
Hello, SQL Server(PHP) World!
Posted on 9月 27th, 2012 by cx20
SQL Server Driver for PHP
SQL Server Driver for PHP はマイクロソフト社より提供されている PHP 向けの SQL Server ドライバである。
ドライバの形式として、PHP 拡張形式と PDO(PHP Data Object)形式の2種類が存在する。
以下は PHP 拡張版の SQL Server Driver の例となっている。なお、SQL Server ドライバは既定では組み込まれていない為、使用するには、以下の設定を追加する必要がある。
PHP 設定(PHP 5.4 / スレッドセーフのドライバを指定した場合)
ソースコード(PHP + PHP 拡張 + SQL Server)
<?php $serverName = "(local)"; $connectionInfo = array( "UID"=>"sa", "PWD"=>"P@ssW0rd", "Database"=>"master" ); $conn = sqlsrv_connect( $serverName, $connectionInfo ); $stmt = sqlsrv_query( $conn, "SELECT 'Hello, SQL Server(PHP) World!' AS Message" ); while( $row = sqlsrv_fetch_array( $stmt ) ) { echo "Messagen"; echo "-------------------n"; echo $row[0]; } sqlsrv_free_stmt( $stmt ); sqlsrv_close( $conn ); ?>
実行方法
C:¥> php hello.php
実行結果
Message ------------------- Hello, SQL Server(PHP) World!
-
Hello, LINQ(VB.NET) World!
Posted on 9月 1st, 2012 by cx20
LINQ(VB.NET)
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 コレクション、ファイル、文字列など ソースコード(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
コンパイル方法(VB.NET + LINQ to SQL)
C:¥> vbc Hello.vb
実行結果
Hello, LINQ World!
-
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!
-
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!
-
Hello, ADO World!
Posted on 3月 23rd, 2012 by cx20
ADO
ADO(ActiveX Data Objects)は、マイクロソフト社が開発した COM ベースの DBMS 接続用 API である。
OLE DB プロバイダを介することで様々な DBMS への接続が可能となっている。
OLE DB プロバイダとしては、以下のようなプロバイダがある。いくつかが OS 標準で付属している他、追加インストールが可能である。プロバイダ名 表示名 説明 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 データベース ソースコード(VBScript + ADO + OLEDB + Jet データベース)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=.hello.mdb" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
ソースコード(VBScript + ADO + OLEDB + ACE データベース)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=.hello.accdb" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend End Sub
ソースコード(VBScript + ADO + OLEDB + SQL Server)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=SQLOLEDB;" & _ "SERVER=(local);DATABASE=master;", _ "sa", "P@ssW0rd" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
ソースコード(VBScript + ADO + OLEDB + Oracle)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=MSDAORA;Data Source=ORCL", "scott", "tiger" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message FROM DUAL") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
ソースコード(VBScript + ADO + ODBC + SQL Server)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=MSDASQL;Driver={SQL Server};" & _ "SERVER=(local);DATABASE=master;", _ "sa", "P@ssW0rd" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
ソースコード(VBScript + ADO + ODBC + Oracle)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=MSDASQL;Driver={Microsoft ODBC for Oracle};Server=ORCL", _ "scott", "tiger" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message FROM DUAL") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
ソースコード(VBScript + ADO + ODBC + MySQL)
Option Explicit Call Main() Sub Main() Dim cn Dim rs Set cn = CreateObject("ADODB.Connection") cn.Open "PROVIDER=MSDASQL;Driver={MySQL ODBC 5.1 Driver};Server=localhost", _ "root", "P@ssW0rd" Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") While Not rs.EOF WScript.Echo rs(0).Name WScript.Echo "-------------------" WScript.Echo rs(0).Value rs.MoveNext Wend rs.Close cn.Close End Sub
実行方法(Windows)
C:¥> CScript //Nologo Hello.vbs
実行結果
Message ----------------- Hello, ADO World!
-
Hello, ODBC(API) World!
Posted on 3月 21st, 2012 by cx20
ODBC(API)
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 ソースコード(VC + ODBC + Jet データベース)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + ACE データベース)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + SQL Server)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + Oracle)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={Microsoft ODBC for Oracle};SERVER=ORCL;UID=scott;PWD=tiger") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message FROM DUAL") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
ソースコード(VC + ODBC + MySQL)
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <sqlext.h> #include <sql.h> int _tmain( int argc, TCHAR* argv[] ) { HENV henv; HDBC hdbc; HSTMT hstmt; _TCHAR szConnStr[1024]; _TCHAR szConnOut[1024]; SQLSMALLINT cchConOut; _TCHAR szSQL[256]; SQLTCHAR szColName[128]; SQLSMALLINT nBufSize; SQLSMALLINT nSqlType; SQLULEN nColSize; SQLSMALLINT nScale; SQLSMALLINT nNullable; SQLTCHAR szMessage[256]; SQLLEN nMessageLen; SQLRETURN nReturn; _tcscpy( szConnStr, _T("Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd") ); _tcscpy( szSQL, _T("SELECT 'Hello, ODBC World!' AS Message") ); SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); SQLDriverConnect( hdbc, NULL, (SQLTCHAR*)szConnStr, _tcslen(szConnStr), (SQLTCHAR*)szConnOut, _countof(szConnOut), &cchConOut, SQL_DRIVER_NOPROMPT ); SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, (SQLTCHAR*)szSQL, SQL_NTS ); SQLDescribeCol( hstmt, 1, (SQLTCHAR*)szColName, _countof(szColName), &nBufSize, &nSqlType, &nColSize, &nScale, &nNullable ); SQLBindCol( hstmt, 1, SQL_C_TCHAR, szMessage, _countof(szMessage), &nMessageLen ); while( TRUE ) { nReturn = SQLFetch( hstmt ); if( nReturn != SQL_SUCCESS && nReturn != SQL_SUCCESS_WITH_INFO ) { break; } _tprintf( _T("%sn"), szColName ); _tprintf( _T("------------------n") ); _tprintf( _T("%sn"), szMessage ); } SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); SQLFreeConnect( hdbc ); SQLFreeEnv( henv ); return 0; }
コンパイル&リンク方法(Visual C++)
C:¥> cl hello.c /link odbc32.lib
実行結果
Message ------------------ Hello, ODBC World!
-
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, SQL Server Compact World!
Posted on 3月 8th, 2012 by cx20
SQL Server Compact
SQL Server Compact はマイクロソフトの組み込み向け RDBMS である。
SQL Server の T-SQL(Transact-SQL)のサブセットが利用できる。
SQL Server Compact 向けのコマンドラインツール(sqlcecmd.exe)は CodePlex よりダウンロードできる。
ソースコード(T-SQL)
実行方法
C:¥> sqlcecmd -d "Data Source=hello.sdf" -i hello.sql
実行結果
Message ------- Hello, SQL Server Compact World! (1 rows affected)
-
Hello, SQL Server World!
Posted on 3月 7th, 2012 by cx20
SQL Server
SQL Server はマイクロソフトの RDBMS である。プログラミング言語として SQL 言語を拡張した T-SQL(Transact-SQL)が用いられる。
元々は Sybase の UNIX 向け製品であったが、Sybase と提携して Windows 版が開発された。提携解消後は独自の進化を遂げている。バージョン リリース 製品名 コードネーム 6 1996年 SQL Server 6.0 SQL95 6.5 1997年 SQL Server 6.5 Hydra 7 1999年 SQL Server 7.0 Sphinx 8 2000年 SQL Server 2000 Shiloh 9 2005年 SQL Server 2005 Yukon 10 2008年 SQL Server 2008 Katmai 10.5 2010年 SQL Server 2008 R2 Kilimanjaro 11 2012年 SQL Server 2012 Denali SQL Server のコマンドラインツールとして従来は isql や osql が用いられてきたが、SQL Server 2000 の時に isql が非推奨となり、SQL Server 2005 以降は osql も非推奨となった。現在は、sqlcmd の使用が推奨されている。ツールの機能はほぼ同じであるが、使用しているライブラリが異なっている。
ツール ライブラリ 6.5 7.0 2000 2005 2008 2012 isql DB-Library ○ ○ 非推奨 - - - osql ODBC ○ ○ ○ 非推奨 非推奨 非推奨 sqlcmd OLE DB (2005~2008)
ODBC (2012~)- - - ○ ○ ○ ソースコード(T-SQL)
実行方法(入力ファイルをリダイレクト指定した場合)
C:¥> sqlcmd -S ServerName -U UserName -P Password < hello.sql
実行方法(ファイル名をオプション指定した場合)
C:¥> sqlcmd -S ServerName -U UserName -P Password -i hello.sql
実行結果
Message ------------------------ Hello, SQL Server World! (1 行処理されました)