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
コメント