< sanitize属性 | 主キーを別のファイルグループに作成したくても・・・ >

February 26, 2004

MSDEのデータをエクスポート・インポートするJScript

MSDEのデータを手軽にExport/ImportするWSHスクリプトです。'.js'拡張子をつけて保存し、ダブルクリックするかコンソールからCSCRIPT Export.jsなどとして実行します。わざわざ実行速度の遅いJScriptで作っている理由は、単に try{...} catch( e ) {...} でトランザクション処理がしたかったというだけのことです 笑。

MSDE用になっているのは接続文字列だけなので、その部分のみ変更すればOracleやJETなど、ADOで接続可能なDBであれば使用可能だと思います。(でもWSHが利用可能な環境でしか実行できません。)

// Export.js
var gstrCATALOG_NAME	= 'MYDB';

go();	// Go!

function go() {
	try {
		var adoCon	= open_connection();
		var adxCat	= WScript.CreateObject( 'ADOX.Catalog' );
		adxCat.ActiveConnection	= adoCon;
		
		for ( var em = new Enumerator( adxCat.Tables ); !em.atEnd(); em.moveNext() ) {
			var tblItem	= em.item();
			if ( tblItem ) export_table( adoCon, tblItem.Name );
		}
		
		adoCon.Close();
		
		WScript.echo( '完了しました' );
		
	} catch( e ) {
		WScript.echo( e.description );
	}
}

function open_connection() {
	var sCon	 = "Provider=SQLOLEDB.1;";
	sCon		+= "Data Source=(local);";
	sCon		+= "User ID=sa;";
	sCon		+= "Password=mypass;";
	sCon		+= "Initial Catalog=" + gstrCATALOG_NAME;
	
	var adoCon	= WScript.CreateObject( "ADODB.Connection" );
	adoCon.Open( sCon );
	
	return adoCon;
}

function export_table( adoCon, sName ) {
	var adOpenKeyset		= 1;
	var adLockReadOnly		= 1;
	var adCmdTableDirect	= 512;
	var adPersistADTG		= 0;
	var adPersistXML		= 1;
	
	if ( !sName ) return;
	
	var adoRec	= WScript.CreateObject( 'ADODB.Recordset' );
	adoRec.Open( sName, adoCon, adOpenKeyset, adLockReadOnly, adCmdTableDirect );
	adoRec.Save( sName + '.tbl', adPersistADTG );
	adoRec.Close();
}
// Import.js
var gstrCATALOG_NAME	= 'MYDB';

go();	// Go!


function go() {
	var adoCon	= open_connection();
	
	var fsoSys	= WScript.CreateObject( 'Scripting.FileSystemObject' );
	var fldCur	= fsoSys.GetFolder( '.' );
	var em		= new Enumerator( fldCur.Files );
	var oRegex	= /\.tbl$/i;
	
	for ( ; !em.atEnd(); em.moveNext() ) {
		var fleItem	= em.item();
		var sName	= fleItem.Name
		if ( sName.match( oRegex ) ) {
			WScript.echo( fleItem.Path );
			try {
				adoCon.BeginTrans();
				import_table( adoCon, fsoSys.GetBaseName( fleItem.Name ) );
				adoCon.CommitTrans();
			} catch( e ) {
				WScript.echo( e.description );
				adoCon.RollbackTrans();
			}
		}
	}
	
	adoCon.Close();
	
	WScript.echo( '完了しました' );
		
}

function open_connection() {
	var sCon	 = "Provider=SQLOLEDB.1;";
	sCon		+= "Data Source=(local);";
	sCon		+= "User ID=sa;";
	sCon		+= "Password=mypass;";
	sCon		+= "Initial Catalog=" + gstrCATALOG_NAME;
	
	var adoCon	= WScript.CreateObject( "ADODB.Connection" );
	adoCon.Open( sCon );
	
	return adoCon;
}

function import_table( adoCon, sName ) {
	var adOpenKeyset			= 1;
	var adOpenDynamic			= 2;
	var adOpenStatic			= 3;
	var adLockReadOnly			= 1;
	var adLockBatchOptimistic	= 4;
	var adCmdTableDirect		= 512;
	var adCmdFile 				= 0x100;
	var adUseClient				= 3;
	
	if ( !sName ) return;
	
	// ファイルを開く
	var adoRecSrc	= WScript.CreateObject( 'ADODB.Recordset' );
	adoRecSrc.Open( sName + '.tbl', adoRecSrc.ActiveConnection, adOpenKeyset, adLockReadOnly, adCmdFile );
	
	// コピー先
	var adoRecDest	= WScript.CreateObject( 'ADODB.Recordset' );
	adoRecDest.CursorLocation	= adUseClient;
	
	do {
		try {
			adoRecDest.Open( sName, adoCon, adOpenStatic, adLockBatchOptimistic, adCmdTableDirect );
			break;
			
		} catch( e ) {
			// テーブルが存在しない?→作成
			var adxCatalog	 		= WScript.CreateObject( 'ADOX.Catalog' );
			adxCatalog.ActiveConnection	= adoCon;
			var adxTable			= WScript.CreateObject( 'ADOX.Table' );
			adxTable.Name			= sName;
			for  ( var em = new Enumerator( adoRecSrc.Fields ); !em.atEnd(); em.moveNext() ) {
				var ofield	= em.item();
				adxTable.Columns.Append( ofield.Name, ofield.Type, ofield.DefinedSize );
			}
			try {
				adxCatalog.Tables.Append( adxTable );
			} catch( e ) {
				// 失敗したら、あきらめる
				WScript.echo( sName + ' テーブルAppendに失敗' );
				throw( e );
			}
			
			// Nothing処理
			adxCatalog	= adoRecDest.ActiveConnection;
		}
	} while( true );
	
	// 削除
	while( !adoRecDest.EOF ) {
		adoRecDest.Delete();
		adoRecDest.MoveNext();
	}
	
	// コピー
	var em = new Enumerator( adoRecSrc.Fields );
	while( !adoRecSrc.EOF ) {
		adoRecDest.AddNew();
		for ( em.moveFirst(); !em.atEnd(); em.moveNext() ) {
			var ofield	= em.item();
			adoRecDest.Collect( ofield.Name ) = ofield.Value;
		}
		adoRecDest.Update();
		adoRecSrc.MoveNext();
	}
	adoRecDest.UpdateBatch();
	
	adoRecSrc.Close();
	adoRecDest.Close();
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/206

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?