SQLの窓

2009年10月25日


PHP : SQLExpress(SQLserver) : COM による接続処理

概要

要するに ADO です。ADO はかなり信頼性のある安定した Windows におけるDB 処理の為の
選択肢です。PHP における COM は完璧ではありませんが、PHP 側のインターフェイスを使
うより、慣れている者にとっては問題点が容易に予想でき、既存のコードもあるていど
そのまま利用できるという長所があります。

一部日本語列名を使った参照に問題が出るので、連想配列に入れなおす必要がありますが、
この部分で他のキャラクタセットの対応が出来ますし、オリジナルオプションを付加する
チャンスでもあります
<?
// **********************************************************
// SQLExpress 2005 / OLE DB / 純正接続
// COM(ADO) : 読み込みと更新
// **********************************************************
$Cn = new COM( "ADODB.Connection" );
$Cn->CursorLocation = 3;
$Rs = new COM( "ADODB.Recordset" );
				
$strTarget = "NIGHT_TCP";	// 別名
$strDB = "lightbox";
$strUser = "sa";
$strPass = "passwordpassword";

// **********************************************************
// 接続文字列
// **********************************************************
$ConnectionString =
	"Provider=SQLOLEDB;" .
	"Data Source=$strTarget;" .
	"Initial Catalog=$strDB;" .
	"User ID=$strUser;" .
	"Password=$strPass;";

/*
// ODBC 接続 / {SQL Server}
$strDriver = "{SQL Server}";
// SQL Server は、TCP/IP と 名前付きパイプで接続されました
$ConnectionString =
	"Provider=MSDASQL;" .
	"Driver=$strDriver;" .
	"SERVER=$strTarget;" .
	"DATABASE=$strDB;" .
	"USER=$strUser;" .
	"PWD=$strPass;";
*/

/*
// ODBC 接続 / {SQL Native Client}
$strDriver = "{SQL Native Client}";
// TCP/IP で接続するのに、Trusted_Connection=yes; が必要でした
// http://technet.microsoft.com/ja-jp/library/ms130822(SQL.90).aspx
// 上記指定が無い場合、名前付きパイプでは接続されました
// $strTarget = "lbox";	// 名前付きパイプの別名
$ConnectionString =
	"Provider=MSDASQL;Trusted_Connection=yes;" .
	"Driver=$strDriver;" .
	"SERVER=$strTarget;" .
	"DATABASE=$strDB;" .
	"USER=$strUser;" .
	"PWD=$strPass;";
*/

// **********************************************************
// 接続
// **********************************************************
$Cn->Open( $ConnectionString );

$Query = "select * from [社員マスタ]";

// **********************************************************
// レコードセット
// **********************************************************
$handle = fopen( ".\\社員マスタ.csv", "w" );

// レコードセットが開いていたら、閉じておく
if ( $Rs->State >= 1 ) {
	$Rs->Close();
}
$Rs->Open( $Query, $Cn );

$nFields = $Rs->Fields->Count;
$hbuffer = "";
$update_cnt = 0;
while( !$Rs->EOF ) {
	if ( $hbuffer == "" ) {
		for( $i = 0; $i < $nFields; $i++ ) {
			if ( $hbuffer != "" ) {
				$hbuffer .= ",";
			}
			$hbuffer .= $Rs->Fields[$i]->Name;
		}
		fwrite( $handle, $hbuffer . "\n" );
	}

	$buffer = "";
	for( $i = 0; $i < $nFields; $i++ ) {
		if ( $buffer != "" ) {
			$buffer .= ",";
		}
		$buffer .= $Rs->Fields[$i]->Value . "";

		// 日本語名称で直接参照できないので、連想配列を作成
		$Column[$Rs->Fields[$i]->name] = $Rs->Fields[$i]->value;

	}
	fwrite( $handle, $buffer . "\n" );

	// 更新( 別接続 )
	$day = ($update_cnt % 6) + 1;
	$Query = "update [社員マスタ] set [生年月日] = '2005/01/0$day'";
	// 連想配列で値を参照
	$Query .= " where [社員コード] = '{$Column["社員コード"]}'";
	$Cn->execute( $Query );

	$Rs->MoveNext();
	$update_cnt++;

}

// **********************************************************
// ファイルクローズ
// **********************************************************
fclose( $handle );
// **********************************************************
// 接続解除
// **********************************************************
@$Cn->Close();
?>
信頼関係接続は、解決策ではありません。
本来、ログインが必要なものを Windows の認証で代替するものです。
この場合、バグだと思われますが、どうしてもその環境で接続したい場合の
回避策です

関連する記事
ログイン・ユーザの作成


【SQLExpressの最新記事】
posted by lightbox at 2009-10-25 22:33 | SQLExpress | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり