Macro/投稿/187 のバックアップの現在との差分(No.1)




  • 追加された行はこの色です。
  • 削除された行はこの色です。
* ODBC経由でSQL文実行 [#bb8824ee]
-ページ: [[Macro/投稿]]
-作者: [[t_ishida]]
-カテゴリー: js
-投稿日: 2008-02-05 (火) 20:14:26

** メッセージ [#ze61a2e6]
#code(javascript){{
  /***************************************************************************************************
  * SQLのなんか.js
  * 概要
  *   エディタの中でODBCでDBにつないでSQL文を実行したり、レコードを取得したりを出来る。
  *   DAO3.6が無いと使えない
  *   うん、はじめてサクラエディタのマクロって作ったが、Emacs系のマクロAPIの便利さが身にしみてよく分かる。
  * @ver 0.0.0.1
 ***************************************************************************************************/
 //
 // 環境設定部
 //
 
 
 //DBのユーザー名
 var us  = "";
 
 //パスワード
 var ps  = "";
 
 //使うDB
 var db  = "";
 
 //ODBCデータソース名
 var dsn = "";
 
 var cn_str = "ODBC" +
              ";DSN="  + dsn +
              ";UID="  + us  +
              ";PWD="  + ps  +
              ";DB="   + db;
 
 // 実行結果の出力先(現在はcurrentしか選べん)
 //var output            = 'other';
 var output              = 'current';
 
 //currentの時、出力結果を毎度書き換えるかどうか(y/n)
 var clear_prevoutput    = 'y';
 
 //実行後に現在の行に戻るかどうか?(y/n)
 var return_current_line  = 'y';
 
 //DAOをnew ActiveXObjectするための文字列
 var DAO = "DAO.DBEngine.36";
 
 //DAOのデータタイプ
 var dat_type = {
   //数値
   16 : "数値", 9  : "数値", 1  : "数値" ,
   2  : "数値", 5  : "数値", 17 : "数値" ,
   20 : "数値", 7  : "数値", 21 : "数値" ,
   15 : "数値", 3  : "数値", 4  : "数値" ,
   11 : "数値", 19 : "数値", 6  : "数値" ,
  
   //日付
   22 : "日付"  , 23 : "日付" , 8  : "日付" ,
  
   //文字列
   12 : "文字列", 10 : "文字列" , 18 : "文字列"
 };
 var db_type = 'sqlserver';
 var cmd_query = [
   '@tab' ,
   '@col'
 ];
 var commands = {
   '@tab' : showTables ,
   '@col' : showColumns
 };
 var cmd_styntax = new RegExp( '^(' + cmd_query.join('|') + ')', 'i');
 
 //SELECT系のシンタックスを正規表現で指定
 var query_syntax = [
   'select .+(?: from)?'
 ];
 var sql_query    = new RegExp('^(?:' + query_syntax.join('|') + ')', 'i');
 
 //実行系のシンタックスを正規表現で指定
 var no_query_syntax =[
   'select .+ into' ,
   'update .+ set' ,
   'insert into' ,
   'create index' ,
   'create table' ,
   'alter table' ,
   'drop table' ,
   'delete from' ,
   'truncate table ' ,
   'bulk insert' ,
 ];
 var sql_no_query = new RegExp('^(?:' + no_query_syntax.join('|') + ')', 'i');
 
 //////////////////////////////////////////////////////////////////////////////////
 // 処理部 => こっから下はやる気のある人以外は触ったらイヤン
 //////////////////////////////////////////////////////////////////////////////////
 var st_no        = ExpandParameter('$y') - 0;
 var st_col       = ExpandParameter('$x') - 0;
 
 // 出力先の変更(バージョン1.15.11からしか、TraceOutは使えないらしいので現在は無意味)
 var say;
 if( output == 'other') {
   ActivateWinOutput();
   say = function(s){ TraceOut(s,1); };
 } else {
   say = function(s){ InsText(s + "\r\n"); };
 }
 
 var param;
 if( IsTextSelected() ){
   param = GetSelectedString();
   BeginSelect();
 } else {
   for( var i=1; i <= GetLineCount(0); i++ ) {
     param += GetLineStr(i);
   }
 }
 param = param.replace( /^\s*--.*(\r\n|\r|\n)/, "" ).replace( /(?:\r\n|\r|\n| +)/g, " " );
 if( GetLineCount(0) == ExpandParameter("$y") ){ GoFileEnd(0); say("\n\n"); Jump(st_no); }
 if( output == "current" && clear_prevoutput == "y" ){
   SearchNext("@---- SQL");
   if ( !IsTextSelected() ) {
     while( GetLineStr(0) != '' ) {
       Down(0);
       if( GetLineCount(0) == ExpandParameter( "$y" ) ) break;
     }
   } else {
     GoLineTop(0);
     while( !GetLineStr(0).match(/@---- __END__ ----@/) ){
       Down_Sel();
       if( GetLineCount(0) == ExpandParameter( "$y" ) ) break;
     }
    
     if ( GetLineStr(0).match(/@---- __END__ ----@/) ) {
       Delete();
       DeleteLine();
     }
   }
 }
 var dbe = new ActiveXObject( DAO );
 var ws  = dbe.CreateWorkspace( "", "", "", 1 );
 var cn;
 try {
   cn  = ws.OpenConnection( "", 3, false, cn_str );
 } catch(e){
   say( "接続エラー:" + e.message );
   say( "繋がらないから設定確認して" );
   throw(e);
 }
 var arr_sql = param.split(";");
 ws.BeginTrans();
 say( "@---- SQLを実行するよ(select系以外は何も出なけりゃ成功だよ) ----@" );
 for(var i = 0; i < arr_sql.length; i++ ){
  var s   = arr_sql[i].replace( /^\s*(.+)$/, "$1" );
   if( s.match( /^\s+$/ ) ) continue;
   try {
     if      ( s.match( cmd_styntax )  ) say( commands[RegExp.$1]( s, cn ) );
     else if ( s.match( sql_query )    ) say( getRecordTable( s, cn ) );
     else if ( s.match( sql_no_query ) ) cn.Execute( s );
     else                                continue;
   } catch(e) {
     ws.Rollback();
     say( "SQL実行エラー(ろーるばっくしたよ):" );
     if( dbe.Errors.Count ){
       for( var i = 0; i < dbe.Errors.Count; i++ ){
         say( "\t" + dbe.Errors(i).Description );
       }
     } else {
       say( "\t" + e.message );
     }
     say( "駄目だったやつ:");
     say( "\t" + s );
     break;
   }
   say("");
 }
 say( "@---- __END__ ----@" );
 ws.CommitTrans();
 cn.Close();
 if ( return_current_line == 'y' ) Jump( st_no );
 else                              GoFileEnd( 0 );
 
 function getRecordTable( s, cn ){
   var rs;
   var ret = '';
   rs = cn.OpenRecordSet( s, 2 );
   if( rs.EOF ) return '取れなかったよ';
   rs.MoveLast();
   if ( ( rs.RecordCount * rs.Fields.Count ) > 30000 ) {
     rs.Close();
     return 'そんなにいっぱい書けないっす(^_^;)'
   }
   rs.MoveFirst();
   var ln  = '';
   var fld = null;
   for( var i = 0; i < rs.Fields.Count; i++ ) {
     if ( ln ) ln += "\t";
     fld = rs.Fields.Item(i);
     ln += fld.Name + "(" + dat_type[fld.Type] + ")";
   }
   ret = ln + "\r\n";
  
   while( rs.EOF == false ){
     ln = '';
     for( var i=0;i < rs.Fields.Count; i++ ){
       if ( ln ) ln += "\t";
       fld = rs.Fields.Item(i);
       if      ( fld.Value == null )            ln += "NULL";
       else if ( dat_type[fld.Type] == '日付' ) ln += formatDate(fld.Value);
       else                                     ln += fld.Value;
     }
     ret += ln + "\r\n";
     rs.MoveNext();
   }
   rs.Close();
   return ret;
 }
 
 function formatDate(src){
   var dd = new Date(src);
   var y = dd.getYear(),  m  = dd.getMonth() + 1, d = dd.getDate();
   var h = dd.getHours(), mi = dd.getMinutes(),   s = dd.getSeconds();
   if ( y  < 2000 ) y += 1900;  
   if ( m  < 10 )   m  = "0" + m;
   if ( d  < 10 )   d  = "0" + d;
   if ( h  < 10 )   h  = "0" + h;
   if ( mi < 10 )   mi = "0" + mi;
   if ( s  < 10 )   s  = "0" + s;
   return y + "/" + m + "/" + d + " " + h + ":" + mi + ":" + s;
 }
 
 function showTables( cmd, cn ){
   var tab_nm = '';
   if( cmd.match( /like +(\S+)$/i ) ) tab_nm = RegExp.$1;
   var s = {
     'sqlserver' : function(){
       var x = "select o.name as tab_name from sysobjects o where o.name like @param@ order by o.id";
       if( tab_nm ) x = x.replace( /@param@/, tab_nm );
       else         x = x.replace( /where .+ order by/, "order by" );
       return x;
     }
   }[db_type]();
   return getRecordTable( s, cn );
 }
 
 function showColumns( cmd, cn ){
   var col_nm = '' , tab_nm = '';
   if ( cmd.match( / tab +like +(\S+)/i ) ) tab_nm = RegExp.$1;
   if ( cmd.match( /col +like +(\S+)/i ) )  col_nm = RegExp.$1;
   var s = {
     'sqlserver'  :  function(){
       var x = "select "                         +
               "   o.name   as tab_name "        +
               ",  c.colorder as col_no "        +
               ",  c.name   as col_nm "          +
               ",  t.name   as type_nm "         +
               ",  c.length as col_len "         +
               ",  p.value  as col_com "         +
               "from "                           +
               "   sysobjects    o  "            +
               ",  syscolumns    c  "            +
               ",  systypes      t  "            +
               ",  sysproperties p  "            +
               "where "                          +
               "     o.id        = c.id "        +
               "and  o.id       *= p.id "        +
               "and  c.xtype     = t.xtype "     +
               "and  c.colorder *= p.smallid "   +
               "and  o.xtype     = 'U' "         +
               "and  p.type      =  4 "          +
               "and  o.name      like @param1@ " +
               "and  c.name      like @param2@ " +
               "order by  "                      +
               "    o.id ,  "                    +
               "    c.colorder";
       if   ( tab_nm ) x = x.replace( /@param1@/i, tab_nm );
       else            x = x.replace( /and +o.name +like +@param1@/,' ');
       if   ( col_nm ) x = x.replace( /@param2@/i, col_nm );
       else            x = x.replace( /and +c.name +like +@param2@/,' ');
       return x;
     }
   }[db_type]();
   return getRecordTable( s, cn );
 }
}}



    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS