ntDB.java 
-------------------------------------------------------------------------- 
package cint; 
/* 存取数据库2002 注意:和dba.ntDB不能互换取代 ,尤其注意 */ 
/* 方法介绍:     public static String sql_TRANS_ERROR     public int rowCount ;     public int colCount ;     public String[] fieldName ;     public int[] fieldType ;     public int[] columnDisplaySize ;     public String[][] data = null ; 
  public boolean isSaveField( String s )   public String noPrefixField( String s )   file://如果增加,会返回增加后的id号   public String toDB( Hashtable requestHt ) throws Exception   public Hashtable copyRequestHt( Hashtable requestHt ) throws Exception   public void createTable( String dbName                          , String globalTableName ) throws Exception   public int executeQuery( String _connName, String SQL )       throws SQLException,Exception   public int executeUpdate( String _connName, String SQL )        throws Exception   public String data(int i, String _fieldName){     public String data( int i                     , String _fieldName                     , int _begin                      , int _end )   从数据库中取值                       public String getKV( String dbName , String tableName,int _pid , String _k )        throws Exception   public String getKV(  String dbName                        ,String tableName                        ,int    _pid                        ,String _k                        ,int _begin //                        ,int _end   //                      ) throws Exception   public String getKV( String dbName, String tableName,String _pid , String _k )        throws Exception   public String getKV(  String dbName                        ,String tableName                        ,String _pid                        ,String _k                        ,int _begin //                        ,int _end   //                      ) throws Exception   从data中取得值                        public String getKV( int _pid , String _k ) throws Exception     public String getKV( int    _pid file://1                        ,String _k   file://2                        ,int _begin  file://3                        ,int _end    file://4                      ) throws Exception   public String getPublish( int _pid , String _k ) throws Exception{   public static boolean isNumeric( String s ){   public static boolean isInt( String s ){   public static boolean isDate( String s ){   public static boolean isDateTime( String s ){     public static String ntSubString( String _s , int _begin , int _end ){       public static String nt8859( String s ) throws Exception{   public static String ntFormatHour( String s ){   public static int ntGetMonthDayCount( int year ,int month ){   public static String ntEncodeHtml( String s ){   public static String ntEncodeSimple( String s ){   public static String ntEncodeDB( String s ){       public static String ntRemoveChar( String s, char cDel ){   public static int ntStringIndexOf( String[] ss , String s )   public static String toPinYin(String str, String flag) throws Exception {   public static String toPinYin_IntToPY(Integer n){       public static void fileCopy(String from, String to, boolean overwrite) throws Exception{     
 */ 
 /* 调用范例  * nttest  * <%@page import="java.util.*"%>  * <%@page import="java.text.*"%>  * <%@page import="dba.ntDB"%>  * <%  *   ntDB nt = new ntDB();  *   nt.executeQuery("yw","select * from msgboard_wjm");  *   * out.println( (new SimpleDateFormat(  *              "yyyy-MM-dd HH:mm:ss.SSS")).format(new Date()) );  *   file://out.println( (new Date()).toString() );  *   *   out.println("<br>");  *   out.println( nt.rowCount );  *   out.println("<table border=1 >");  *   for(int i=0;i< nt.rowCount;i++ ){  *   *   *     if(i==0){  *       out.println("<tr>");  *       for(int k=0;k< nt.colCount;k++ ){  *         out.println("<td>");  *         out.print( nt.fieldName[k] );  *         out.print("</td>");  *       }  *       out.println("</tr>");  *     }  *   *     out.println("<tr>");  *     for(int j=0;j< nt.colCount;j++ ){  *       out.println("<td>");  *       out.println( nt.data[i][j] );  *       out.println("</td>");  *     }  *     out.println("</tr>");  *   }  *   out.println("</table>");  * %>  */ 
import java.util.*; import java.lang.*; import java.text.*; import java.sql.*; import java.sql.Connection; import javax.sql.*; import javax.naming.*; import javax.transaction.*; import java.io.*; import java.net.*; 
public  class ntDB {   private Connection con;   private String connName;   private Statement statement ;   private ResultSet rs = null ;   private ResultSetMetaData rsmd; 
  public static String sql_TRANS_ERROR =      " if @@error<>0 set @ntE=@ntE+1 \n"; 
  file://额外方法, 汉字转化为拼音   private static Hashtable ht_PinYin=new Hashtable(10); 
  public int rowCount ;   public int colCount ;   public String[] fieldName ;   public int[] fieldType ;   public int[] columnDisplaySize ;   public String[][] data = null ;   ////额外方法      public ntDB() {     rowCount=-1;     colCount=-1;   } 
  private void getConn(){      try{        Context env=(Context)new InitialContext().lookup("java:comp/env");           DataSource ds = (DataSource) env.lookup("jdbc/"+connName);           con = ds.getConnection();      }catch(Exception e){        e.printStackTrace();           con = null;      }   } 
  private void closeConn() throws Exception   {     if( con != null )       con.close();   } 
  // GBDP技术 begin --------------------------------------      public boolean isSaveField( String s )   {     if(  s.equals("edit")        || s.equals("add")        || s.equals("delete")        || s.equals("id")        || s.equals("globalTableName")        || s.equals("parentKey")        || s.equals("parentValue")        || s.equals("sql_trans")        || s.equals("dbName")        || s.toLowerCase().indexOf("submit") == 0        || s.toLowerCase().indexOf("nouse") == 0        || s.toLowerCase().indexOf("useless") == 0        || s.toLowerCase().indexOf("imagefield") == 0        )       return false;     else       return true;     } 
  public String noPrefixField( String s )   {     if(  s.toLowerCase().indexOf("numeric") == 0 )       return s.substring(7,s.length());     else if( s.toLowerCase().indexOf("text") == 0 )       return s.substring(4,s.length());     else if( s.toLowerCase().indexOf("datetime") == 0 )       return s.substring(8,s.length());     else if( s.toLowerCase().indexOf("date") == 0               && s.toLowerCase().indexOf("datetime") < 0)       return s.substring(4,s.length());     else if( s.toLowerCase().indexOf("int") == 0 )       return s.substring(3,s.length());     return s;     }      public String toDB( Hashtable requestHt ) throws Exception   {     String result = "";      String sql = "";      String globalTableName = null ;     int id = 0 ;     String sql_trans = null ;     String dbName = null ;     int masterId = 0;     String parentKey = null ;     String parentValue = null ; 
    // begin 检查     if( requestHt.get("id")==null && requestHt.get("edit")!=null )        throw new Exception("GBDP:编辑没有提供id号! "); 
    if( requestHt.get("id")==null && requestHt.get("delete")!=null )        throw new Exception("GBDP:删除没有提供id号! "); 
    globalTableName = (String)requestHt.get("globalTableName");     if( globalTableName == null || globalTableName.equals("") )       throw new Exception("GBDP:没有提供globalTableName! "); 
    if( requestHt.get("edit")!=null          || requestHt.get("delete")!=null )     {            try{         id = Integer.parseInt((String)requestHt.get("id"));       }catch(Exception e){         throw new Exception("GBDP:没有提供正确的id号! "+           (String)requestHt.get("id"));       }     }   
    sql_trans = (String)requestHt.get("sql_trans");     // 因为不是必须,所以不用检查,用到时再检查            dbName = (String)requestHt.get("dbName");     if( dbName == null || dbName.equals("") )       throw new Exception("GBDP:没有提供dbName! ");            file://主从表结构的主表id     try{       masterId = Integer.parseInt((String)requestHt.get("masterId"));     }catch(Exception e){       masterId = 0 ;      }            if( requestHt.get("add")!=null          && requestHt.get("parentKey")==null         )        throw new Exception("GBDP:增加没有提供parentKey! ");      parentKey = (String)requestHt.get("parentKey");            if( requestHt.get("add")!=null          && requestHt.get("parentValue")==null         )        throw new Exception("GBDP:增加没有提供parentValue! ");      parentValue = (String)requestHt.get("parentValue");            // end 检查            createTable( dbName , globalTableName );          file://修改     if( requestHt.get("edit")!=null          && requestHt.get("delete")==null ) // isEdit &&  hasId     {       file://检查是否存在       executeQuery(dbName,         "select * from "+ globalTableName +"_main "+         "  where id = "+id );       if( rowCount <= 0 )         throw new Exception( "修改"+ globalTableName +           "出错:数据库没有找到此id号'"+ id +"'");       //       sql = ""+         " declare @i   int  \n"+         " declare @ntE int  \n"+         " select @ntE=0     \n"+         " begin tran        \n"+         " ";                file://加入额外需要在事务内执行的语句,共有3处加入, add, edit , delete         file://String sql_TRANS_ERROR = " if @@error<>0 set @ntE=@ntE+1 \n";         file://String sql_trans = "" ; file://用来插入后面的保存到数据库的sql语句中,使其中在事务之中间       if( sql_trans != null && !sql_trans.equals("") )         sql = sql + sql_trans + sql_TRANS_ERROR;           Enumeration er37 = requestHt.keys();       while (er37.hasMoreElements()) {         String s = ((String)er37.nextElement()).trim();         String sValue = ((String)requestHt.get(s)).trim();         if( sValue == null )           sValue = "";         sValue = ntEncodeDB( sValue );                  String sTableName = globalTableName ;         if( s.indexOf("numeric") == 0 || s.indexOf("n_") == 0 )         {  sTableName = globalTableName + "_numeric" ; }         else if( s.indexOf("int") == 0 || s.indexOf("i_") == 0 )         {  sTableName = globalTableName + "_int" ; }         else if( s.indexOf("date") == 0 || s.indexOf("d_") == 0 )         {  sTableName = globalTableName + "_datetime";             sValue = "'"+sValue+"'";          }         else if( s.indexOf("text") == 0 || s.indexOf("t_") == 0)         {  sTableName = globalTableName + "_text" ;             sValue = "'"+sValue+"'";          }         else           sValue = "'"+sValue+"'";                   file://必须放在这里,因为只有修改和增加数值型字段才满足sValue.equals("")         if( sValue.equals("") )           continue;                  if( isSaveField(s) )         {           sql = sql +           " if exists ( select * from "+ sTableName +" where pid= "+ id +" and k='"+ noPrefixField(s) +"'" +" ) \n"+           "   begin               \n"+           "     update "+ sTableName +" set v = "+ sValue +"  \n"+           "       where pid= "+ id +" and k='"+ noPrefixField(s) +"'  \n" +           "     if @@error<>0  set @ntE=@ntE+1 \n"+           "   end               \n"+           " else     \n"+           "   begin  \n"+           "     select @i=@i "+           "";                        if( !sValue.equals("") && !sValue.equals("''") )              sql = sql +             "     select @i = ( select isNull(min(id),0)-1 from "+ sTableName +" )  \n"+             "     if @i >= 0 select @i = -1 \n"+             "     insert into "+ sTableName +" (id,pid,k,v)   \n"+             "       values( @i, "+ id +  " \n"+             "         , '"+ noPrefixField(s) +"', "+ sValue +")  \n"+             "     if @@error<>0  set @ntE=@ntE+1 \n"+             "";               sql = sql +             " "+             "   end             \n"+             " if @@error<>0  set @ntE=@ntE+1 \n"+             " ";         }       }//end while       sql = sql +         " if @ntE = 0      \n"+         "   commit tran    \n"+         " else             \n"+         "   begin          \n"+         "     rollback tran        \n"+         "     raiserror ('数据库执行出错! ',16,1)  \n"+         "   end     \n"+         " ";                executeUpdate( dbName,sql );     } // end if edit 
    file://添加保存入数据库     if( requestHt.get("add")!=null          && requestHt.get("edit")==null          && requestHt.get("delete")==null )     { // 隔离局部变量       file://int rowNo  = -9999;       file://int formNo = -9999;       file://nt.executeQuery(dbName,"select isNull(max(id),0)+1 from "+ globalTableName +"");       file://formNo = Integer.parseInt( nt.data[0][0] );       file://nt.executeQuery(dbName,"select isNull(min(id),0)-1 from "+ globalTableName +"");       file://rowNo = Integer.parseInt( nt.data[0][0] );          sql = ""+         " declare @ntE int \n"+         " declare @i   int \n"+         " declare @formNo int \n"+         " select @ntE=0       \n"+         " begin tran       \n"+         "";              file://加入额外需要在事务内执行的语句,共有3处加入, add, edit , delete         file://String sql_TRANS_ERROR = " if @@error<>0 set @ntE=@ntE+1 \n";         file://String sql_trans = "" ; file://用来插入后面的保存到数据库的sql语句中,使其中在事务之中间       if( sql_trans != null && !sql_trans.equals("") )         sql = sql + sql_trans + sql_TRANS_ERROR;                 sql = sql +         " select @i = ( select isNull(max(id),0)+1 from "+ globalTableName +"_main )  \n"+         " select @formNo = @i  \n"+         " insert into "+ globalTableName +"_main (id,pid,k,v) \n"+         "   values( @i, "+ masterId +", '"+ parentKey +"', '"+ parentValue +"')  \n"+         "     if @@error<>0  set @ntE=@ntE+1 \n"+         " ";          Enumeration er44 = requestHt.keys();       while (er44.hasMoreElements()) {         String s = ((String)er44.nextElement()).trim();         String sValue = ((String)requestHt.get(s));         if( sValue == null )           sValue = "";         sValue = sValue.trim();                  if( sValue.equals("") )           continue;                    sValue = ntEncodeDB( sValue );         String sTableName = globalTableName ;         file://判断插入哪个类型(text,numeric,datetime...)的表         if( s.indexOf("numeric") == 0 || s.indexOf("n_") == 0 )         {  sTableName = globalTableName + "_numeric" ; }         else if( s.indexOf("int") == 0 || s.indexOf("i_") == 0 )         {  sTableName = globalTableName + "_int" ; }         else if( s.indexOf("date") == 0 || s.indexOf("d_") == 0 )         {  sTableName = globalTableName + "_datetime";             sValue = "'"+sValue+"'";          }         else if( s.indexOf("text") == 0 || s.indexOf("t_") == 0 )         {  sTableName = globalTableName + "_text"    ;             sValue = "'"+sValue+"'";          }         else           sValue = "'"+sValue+"'";                   if( isSaveField(s) )          {           file://注意:保存到数据库的时候将"numeric","date"等前缀去除了             sql = sql +           " select @i = ( select isNull(min(id),0)-1 from "+ sTableName +" )  \n"+           " if @i >= 0 select @i = -1 \n"+           " insert into "+ sTableName +" (id,pid,k,v) "+           "  values( @i, @formNo , '"+ noPrefixField(s) +"', "+ sValue +")  "+           "     if @@error<>0  set @ntE=@ntE+1 "+           " ";         }       }//end while       sql = sql +         " if @ntE = 0      "+         "   commit tran    "+         " else             "+         "   begin          "+         "     rollback tran        "+         "     raiserror ('数据库执行出错!',16,1) "+         "   end     "+         " ";       executeQuery( dbName,sql + " select @formNo as id " );       if( rowCount > 0 )         result = data[0][0] ;     } // 增加 
    // 将pid 为 id 的删除     if( requestHt.get("delete")!=null ) file://因为一般都是edit和delete同时存在     {        file://检查pid是否存在       executeQuery(dbName,         "select * from "+ globalTableName +"_main "+         "  where id = "+id );       if( rowCount <= 0 )         throw new Exception("删除"+ globalTableName +           "出错:没有找到此id号'"+ id +"'");          sql = ""+         " declare @ntE int \n"+         " declare @i   int \n"+         " select @ntE=0       \n"+         " begin tran       \n"+         "";                file://加入额外需要在事务内执行的语句,共有3处加入, add, edit , delete         file://String sql_TRANS_ERROR = " if @@error<>0 set @ntE=@ntE+1 \n";         file://String sql_trans = "" ; file://用来插入后面的保存到数据库的sql语句中,使其中在事务之中间       if( sql_trans != null && !sql_trans.equals("") )         sql = sql + sql_trans + sql_TRANS_ERROR;                 sql = sql +           "   delete from "+ globalTableName +" where pid = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         "   delete from "+ globalTableName +"_numeric where pid = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         "   delete from "+ globalTableName +"_int where pid = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         "   delete from "+ globalTableName +"_datetime where pid = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         "   delete from "+ globalTableName +"_text where pid = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         "   delete from "+ globalTableName +"_main where id = "+ id + "\n"+         "     if @@error<>0 set @ntE=@ntE+1 \n"+         " if @ntE = 0      \n"+         "   commit tran    \n"+         " else             \n"+         "   begin          \n"+         "     rollback tran        \n"+         "     raiserror ('数据库执行出错! ',16,1)  \n"+         "   end     \n"+         "";       executeUpdate(dbName, sql );        } // end 删除     return result;   } // end toDB      public Hashtable copyRequestHt( Hashtable requestHt ) throws Exception   {     if( requestHt == null )       return null;     Hashtable ht = new Hashtable();     //     Enumeration e = requestHt.keys();     while (e.hasMoreElements()) {       String s = ((String)e.nextElement());       String sValue = ((String)requestHt.get(s));       ht.put( s , sValue );     } // end while       //     return ht;   }      public void createTable( String dbName                          , String globalTableName ) throws Exception   {     String sql = ""; 
    file://检查表是否存在,如果没有,建6表,      //    t_main , t , t_numeric , t_datetime , t_text , t_int     for(int i=0;i<6;i++){       String sTableName = globalTableName ; file://default       String sType = "varchar(255)";        file://default        if( i==1 )       {  sTableName = globalTableName + "_numeric" ; sType = "numeric(38,8)" ;}       else if( i==2 )       {  sTableName = globalTableName + "_datetime"; sType = "datetime"; }       else if( i==3 )       {  sTableName = globalTableName + "_text"    ; sType = "text"; }       else if( i==4 )       {  sTableName = globalTableName + "_main"    ; }       else if( i==5 )       {  sTableName = globalTableName + "_int"    ; sType = "int"; }              sql = sql +       " if not exists( select name from sysobjects         \n"+       "                where name ='"+ sTableName +"' and type='U' ) \n"+       " begin   \n"+       "   create table "+ sTableName +"(    \n"+        "       id  int          primary key  \n"+        "     , pid int          not null     \n"+       "     , v   "+ sType +"  not null     \n"+       "     , k   varchar(255) not null     \n"+        "   )    \n"+       " end \n"+       ""+       " if not exists( select name from sysindexes  \n"+       "                where name like '%idx_"+ sTableName +"_pid%' ) \n"+       " begin   \n"+       "   create index idx_"+sTableName+"_pid on "+sTableName+"(pid) \n"+       " end \n"+       ""+       " if not exists( select name from sysindexes  \n"+       "                where name like '%idx_"+ sTableName +"_k%' ) \n"+       " begin   \n"+       "   create index idx_"+sTableName+"_k on "+sTableName+"(k)   \n"+       " end \n"+       "";              file://因为text子段不能建立索引       if( !sType.equals("text") ){         sql = sql +         " if not exists( select name from sysindexes  \n"+         "                where name like '%idx_"+ sTableName +"_v%' ) \n"+         " begin   \n"+         "   create index idx_"+sTableName+"_v on "+sTableName+"(v)   \n"+         " end \n"+         "";       }              sql = sql + "";     } // end for create table       executeUpdate(dbName,sql);    } // end createTable()      // GBDP技术 end ------------------------------------------- 
  public int executeQuery( String _connName, String SQL )       throws SQLException,Exception   {      file://Hashtable ht = new Hashtable();      try{      connName = _connName;      getConn(); 
     statement = con.createStatement();      String sql = SQL ;      file://sql = new String(sql.getBytes("GBK"),"8859_1");      try{        rs = statement.executeQuery( sql );      }catch(Exception e){        throw new Exception( e.getMessage() + "\n" + sql );      } 
     if( rs == null )        return -1 ;      // getMetaData      rsmd = rs.getMetaData(); file://ResultSetMetaData      colCount = -1;      colCount = rsmd.getColumnCount(); 
     fieldName = new String[colCount]; file://String[]      fieldType = new int[colCount]; file://int[]      columnDisplaySize = new int[colCount]; file://int[] 
     for(int i=0;i<colCount;i++)      {        fieldName[i] = rsmd.getColumnName(i+1) ;        columnDisplaySize[i] = rsmd.getColumnDisplaySize(i+1) ;        fieldType[i] = rsmd.getColumnType(i+1) ;      } 
     //      if( colCount <= 0 )        return -1 ; 
     Vector v = new Vector();      while( rs.next() )      {        String[] sRow = new String[colCount];        for(int i=0;i<colCount;i++){          sRow[i] = rs.getString(i+1);          /*          if( fieldType[i] == java.sql.Types.DATE                ||              fieldType[i] == java.sql.Types.TIME                ||              fieldType[i] == java.sql.Types.TIMESTAMP            )          {            sRow[i] = (new SimpleDateFormat(              "yyyy-MM-dd HH:mm:ss.SSS")).format(rs.getTimestamp(i+1));          }          */        }        v.add( sRow );        file://(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date())        // java.sql.Types.DATE      } 
     rowCount = -1; file://int      rowCount = v.size(); file://int      data = new String[rowCount][colCount];      for(int i=0;i<rowCount;i++)      {        for(int j=0;j<colCount;j++){          data[i][j] = ((String[])v.elementAt(i))[j];          if( data[i][j] == null )            data[i][j] = "";          data[i][j] = data[i][j].trim();        }      } 
     rs.close();      statement.close(); 
     /*      if( colCount >= 0 ){        ht.put("fieldCount",""+colCount);        ht.put("colCount",""+colCount);      }      if( fieldName != null )        ht.put("fieldName",fieldName);      if( fieldType != null )        ht.put("fieldType",fieldType);      if( data != null )        ht.put("data",data); file://return data;      ht.put("rowCount",""+rowCount);      */      }finally{        closeConn();      }      return rowCount;   } // end executeQuery() 
  file://返回受影响的记录数量   public int executeUpdate( String _connName, String SQL )        throws Exception   {      String sql = SQL ;      file://sql = new String(sql.getBytes("GBK"),"8859_1");      int result ; 
     connName = _connName;      getConn(); 
     statement = con.createStatement(); file://Statement 
     file://process      try      {        result = statement.executeUpdate( sql );      }      catch (Exception e33)      {        throw new Exception( "newtower:ntDB:executeUpdate:"+ e33.getMessage() + "\n" + sql );      }      finally{        closeConn();      }      return result;   } 
  public String data(int i, String _fieldName){      if( i > rowCount-1 )        return "";      if( ntStringIndexOf(fieldName,_fieldName) < 0 )          return "";      return data[i][ntStringIndexOf(fieldName,_fieldName)];   } 
  public String data( int i                     , String _fieldName                     , int _begin                      , int _end )   {      String s = data(i,_fieldName);      s = ntSubString( s , _begin , _end );      return s;   } 
  public String getKV( String dbName, String tableName,String _pid , String _k )        throws Exception   {     if( _pid == null || _pid.equals("") )        return "";     return getKV( dbName ,tableName , Integer.parseInt(_pid),_k );    }  
  public String getKV( String dbName, String tableName,int _pid , String _k )        throws Exception   {      String tableNameSuffix = "";      /*      因为text,int等前缀不再保存到数据库,所以不必以下的代码了      if( _k.indexOf("numeric")==0 && tableName.indexOf("_numeric")<0 )        tableNameSuffix = "_numeric";      else if( _k.indexOf("int")==0 && tableName.indexOf("_int")<0 )        tableNameSuffix = "_int";      else if( _k.indexOf("text")==0 && tableName.indexOf("_text")<0 )        tableNameSuffix = "_text";      else if( _k.indexOf("date")==0 && tableName.indexOf("_datetime")<0 )        tableNameSuffix = "_datetime";      */   
     this.executeQuery(dbName,        " select v from "+ tableName + tableNameSuffix +        "  where pid = " + _pid +        "    and k ='"+ (_k) + "'" +        "");      if( this.rowCount > 1 )        throw new Exception( tableName + tableNameSuffix +          "发现多于一个值 pid=["+ _pid +"] k=[" + _k +"]" );      if( this.rowCount ==1 )        return data[0][0];      else        return "";   } 
  public String getKV(  String dbName                        ,String tableName                        ,String _pid                        ,String _k                        ,int _begin //                        ,int _end   //                      ) throws Exception   {     if( _pid == null || _pid.equals("") )        return "";     return getKV( dbName,                   tableName,                   Integer.parseInt(_pid),                   _k,                   _begin,                   _end);    }   
  public String getKV(  String dbName                        ,String tableName                        ,int    _pid                        ,String _k                        ,int _begin //                        ,int _end   //                      ) throws Exception   {    file://begin      String s = getKV( dbName ,tableName, _pid ,  _k );      s = ntSubString( s , _begin , _end );      return s;   } 
  public String getKV( int _pid , String _k ) throws Exception   {      String s = "";      for(int i=0;i<rowCount;i++)      {        if( data(i,"pid").equals(""+_pid)            && data(i,"k").equals(""+_k)          )        { s = data(i,"v") ; break; }      }      return s;   } 
  public String getKV( int    _pid file://1                        ,String _k   file://2                        ,int _begin  file://3                        ,int _end    file://4                      ) throws Exception   {      file://begin      String s = getKV( _pid ,  _k );      s = ntSubString( s , _begin , _end );      return s;   } 
  public String getPublish( int _pid , String _k ) throws Exception{        return getKV( "eweb","publish" , _pid, _k );   }   //////////////////////////////////////////////////////////    public static boolean isNumeric( String s ){      try{        Double.parseDouble( s );      }catch(Exception e){        return false;      }      return true;    } 
   public static boolean isInt( String s ){      try{        Integer.parseInt( s );      }catch(Exception e){        return false;      }      return true;    } 
   public static boolean isDate( String s ){      java.util.Date d;      try{        d = DateFormat.getDateInstance().parse( s );      }catch(Exception e){        return false;       }        return true;      } 
   public static boolean isDateTime( String s ){      return isDate(s);    }        public static String ntSubString( String _s , int _begin , int _end ){      String r = _s ;      try{        r = _s.substring(_begin,_end);      }catch(Exception e238SubString){        r = _s ;      }      return r;    } 
   public static String nt8859( String s ) throws Exception{      return new String(s.getBytes("GBK"),"8859_1");    } 
   public static String ntFormatHour( String s ){      if( s == null )        return null;      String r = s;      if( s.trim().length() == 1 )        r = "0" + r;      return r;    } 
   public static int ntGetMonthDayCount( int year ,int month ){      int r = 31 ;      if( month == 4 || month == 6 || month == 9 || month == 11  )        r = 30 ;      if( month == 2 ){        r = 28 ;        if( (year%4)==0 && (year%400)==0 ) r = 29 ;        if( (year%4)==0 && (year%100)!=0 ) r = 29 ;      }      return r;    } 
   public static String ntEncodeHtml( String s ){      if( s == null )        return null;      String r = "";      for( int i=0;i<s.length() ;i++ ){        char c = s.charAt(i);        if( c == '&' )          r = r + "&" ;        else if( c == '\"' )          r = r + """;        else if( c == '<' )          r = r + "<";        else if( c == '>' )          r = r + ">";        else if( c == '\n' )          r = r + "<BR>";        else if( c == ' ' )          r = r + " ";        else          r = r + c;      }//end for      return r;    } // end ntEncodeHtml 
   file://用来将普通字符串转化到""之间, 例如 asdf"\ 到 "asdf\"\\"    public static String ntEncodeSimple( String s ){      if( s == null )        return null;      String r = "";      for( int i=0;i<s.length() ;i++ ){        char c = s.charAt(i);        if( c == '\n' )          r = r + "\\n" ;        else if( c == '\\' )          r = r + "\\\\";        else if( c == (char)(13) )          r = r ;        else if( c == (char)(10) )          r = r ;        else if( c == '\"' )          r = r + "\\\"";        else          r = r + c;      }      return r;    } // end ntEncodeSimple 
   public static String ntEncodeDB( String s ){      if( s == null )        return null;      String r = "";      for( int i=0;i<s.length() ;i++ ){        char c = s.charAt(i);        if( c == '\'' )          r = r + "''" ;        else          r = r + c;      }      return r;    } // end ntEncodeDB 
   public static String ntRemoveChar( String s, char cDel ){      if( s == null ) return null;      String r = "";      for( int i=0;i<s.length() ;i++ ){        char c = s.charAt(i);        if( c == cDel ) ;        else r = r + c;      }      return r;    } // end ntRemoveChar 
   public static int ntStringIndexOf( String[] ss , String s )    {      int pos = -1 ;      for(int i=0;i<ss.length;i++)      {        if( ss[i].equalsIgnoreCase(s) )        {          pos = i;          break;        }      }      return pos;    }        public static String toPinYin(String str, String flag) throws Exception {      char[] hz= nt8859(str).toCharArray();      int len=nt8859(str).length();      int p,q;      String ret="";      for(int i=0;i<len;i++){        p=(int)hz[i];        if(p>160){          q=(int)hz[++i];          p=p*256+q-65536;        }        if( flag.length()>0 )          if( flag.indexOf("C")==0 ){            String s = toPinYin_IntToPY(new Integer(p));            s = s.substring(0,1).toUpperCase() +                 s.substring(1,s.length());            ret+= s + flag.substring(1,flag.length()) ;          }            else            ret+= toPinYin_IntToPY(new Integer(p)) + flag ;          else           ret+= toPinYin_IntToPY(new Integer(p)) ;      } file://for      if( flag.indexOf("C")==0 )        return ret.substring(0,ret.length()-flag.length()+1);      else        return ret.substring(0,ret.length()-flag.length());      } 
   public static String toPinYin_IntToPY(Integer n){      int num=n.intValue();      if(num>0&&num<160){        return String.valueOf((char)num);      }      else if(num<-20319||num>-10247){        return "";      }      else{        if(ht_PinYin.size()==0){toPinYin_ht();}        while(!ht_PinYin.containsKey(Integer.toString(num)))num--;        return ht_PinYin.get(Integer.toString(num)).toString();      }    } 
   private static void toPinYin_ht(){      ht_PinYin.put("-20319","a");      ht_PinYin.put("-20317","ai");      ht_PinYin.put("-20304","an");      ht_PinYin.put("-20295","ang");      ht_PinYin.put("-20292","ao");      ht_PinYin.put("-20283","ba");      ht_PinYin.put("-20265","bai");      ht_PinYin.put("-20257","ban");      ht_PinYin.put("-20242","bang");      ht_PinYin.put("-20230","bao");      ht_PinYin.put("-20051","bei");      ht_PinYin.put("-20036","ben");      ht_PinYin.put("-20032","beng");      ht_PinYin.put("-20026","bi");      ht_PinYin.put("-20002","bian");      ht_PinYin.put("-19990","biao");      ht_PinYin.put("-19986","bie");      ht_PinYin.put("-19982","bin");      ht_PinYin.put("-19976","bing");      ht_PinYin.put("-19805","bo");      ht_PinYin.put("-19784","bu");      ht_PinYin.put("-19775","ca");  ht_PinYin.put("-19774","cai");  ht_PinYin.put("-19763","can");  ht_PinYin.put("-19756","cang");  ht_PinYin.put("-19751","cao");  ht_PinYin.put("-19746","ce");  ht_PinYin.put("-19741","ceng");  ht_PinYin.put("-19739","cha");  ht_PinYin.put("-19728","chai");  ht_PinYin.put("-19725","chan");  ht_PinYin.put("-19715","chang");  ht_PinYin.put("-19540","chao");  ht_PinYin.put("-19531","che");  ht_PinYin.put("-19525","chen");  ht_PinYin.put("-19515","cheng");  ht_PinYin.put("-19500","chi");  ht_PinYin.put("-19484","chong");  ht_PinYin.put("-19479","chou");  ht_PinYin.put("-19467","chu");  ht_PinYin.put("-19289","chuai");  ht_PinYin.put("-19288","chuan");  ht_PinYin.put("-19281","chuang");  ht_PinYin.put("-19275","chui");  ht_PinYin.put("-19270","chun");  ht_PinYin.put("-19263","chuo");  ht_PinYin.put("-19261","ci");  ht_PinYin.put("-19249","cong");  ht_PinYin.put("-19243","cou");  ht_PinYin.put("-19242","cu");  ht_PinYin.put("-19238","cuan");  ht_PinYin.put("-19235","cui");  ht_PinYin.put("-19227","cun");  ht_PinYin.put("-19224","cuo");  ht_PinYin.put("-19218","da");  ht_PinYin.put("-19212","dai");  ht_PinYin.put("-19038","dan");  ht_PinYin.put("-19023","dang");  ht_PinYin.put("-19018","dao");  ht_PinYin.put("-19006","de");  ht_PinYin.put("-19003","deng");  ht_PinYin.put("-18996","di");  ht_PinYin.put("-18977","dian");  ht_PinYin.put("-18961","diao");  ht_PinYin.put("-18952","die");  ht_PinYin.put("-18783","ding");  ht_PinYin.put("-18774","diu");  ht_PinYin.put("-18773","dong");  ht_PinYin.put("-18763","dou");  ht_PinYin.put("-18756","du");  ht_PinYin.put("-18741","duan");  ht_PinYin.put("-18735","dui");  ht_PinYin.put("-18731","dun");  ht_PinYin.put("-18722","duo");  ht_PinYin.put("-18710","e");  ht_PinYin.put("-18697","en");  ht_PinYin.put("-18696","er");  ht_PinYin.put("-18526","fa");  ht_PinYin.put("-18518","fan");  ht_PinYin.put("-18501","fang");  ht_PinYin.put("-18490","fei");  ht_PinYin.put("-18478","fen");  ht_PinYin.put("-18463","feng");  ht_PinYin.put("-18448","fo");  ht_PinYin.put("-18447","fou");  ht_PinYin.put("-18446","fu");  ht_PinYin.put("-18239","ga");  ht_PinYin.put("-18237","gai");  ht_PinYin.put("-18231","gan");  ht_PinYin.put("-18220","gang");  ht_PinYin.put("-18211","gao");  ht_PinYin.put("-18201","ge");  ht_PinYin.put("-18184","gei");  ht_PinYin.put("-18183","gen");  ht_PinYin.put("-18181","geng");  ht_PinYin.put("-18012","gong");  ht_PinYin.put("-17997","gou");  ht_PinYin.put("-17988","gu");  ht_PinYin.put("-17970","gua");  ht_PinYin.put("-17964","guai");  ht_PinYin.put("-17961","guan");  ht_PinYin.put("-17950","guang");  ht_PinYin.put("-17947","gui");  ht_PinYin.put("-17931","gun");  ht_PinYin.put("-17928","guo");  ht_PinYin.put("-17922","ha");  ht_PinYin.put("-17759","hai");  ht_PinYin.put("-17752","han");  ht_PinYin.put("-17733","hang");  ht_PinYin.put("-17730","hao");  ht_PinYin.put("-17721","he");  ht_PinYin.put("-17703","hei");  ht_PinYin.put("-17701","hen");  ht_PinYin.put("-17697","heng");  ht_PinYin.put("-17692","hong");  ht_PinYin.put("-17683","hou");  ht_PinYin.put("-17676","hu");  ht_PinYin.put("-17496","hua");  ht_PinYin.put("-17487","huai");  ht_PinYin.put("-17482","huan");  ht_PinYin.put("-17468","huang");  ht_PinYin.put("-17454","hui");  ht_PinYin.put("-17433","hun");  ht_PinYin.put("-17427","huo");  ht_PinYin.put("-17417","ji");  ht_PinYin.put("-17202","jia");  ht_PinYin.put("-17185","jian");  ht_PinYin.put("-16983","jiang");  ht_PinYin.put("-16970","jiao");  ht_PinYin.put("-16942","jie");  ht_PinYin.put("-16915","jin");  ht_PinYin.put("-16733","jing");  ht_PinYin.put("-16708","jiong");  ht_PinYin.put("-16706","jiu");  ht_PinYin.put("-16689","ju");  ht_PinYin.put("-16664","juan");  ht_PinYin.put("-16657","jue");  ht_PinYin.put("-16647","jun");  ht_PinYin.put("-16474","ka");  ht_PinYin.put("-16470","kai");  ht_PinYin.put("-16465","kan");  ht_PinYin.put("-16459","kang");  ht_PinYin.put("-16452","kao");  ht_PinYin.put("-16448","ke");  ht_PinYin.put("-16433","ken");  ht_PinYin.put("-16429","keng");  ht_PinYin.put("-16427","kong");  ht_PinYin.put("-16423","kou");  ht_PinYin.put("-16419","ku");  ht_PinYin.put("-16412","kua");  ht_PinYin.put("-16407","kuai");  ht_PinYin.put("-16403","kuan");  ht_PinYin.put("-16401","kuang");  ht_PinYin.put("-16393","kui");  ht_PinYin.put("-16220","kun");  ht_PinYin.put("-16216","kuo");  ht_PinYin.put("-16212","la");  ht_PinYin.put("-16205","lai");  ht_PinYin.put("-16202","lan");  ht_PinYin.put("-16187","lang");  ht_PinYin.put("-16180","lao");  ht_PinYin.put("-16171","le");  ht_PinYin.put("-16169","lei");  ht_PinYin.put("-16158","leng");  ht_PinYin.put("-16155","li");  ht_PinYin.put("-15959","lia");  ht_PinYin.put("-15958","lian");  ht_PinYin.put("-15944","liang");  ht_PinYin.put("-15933","liao");  ht_PinYin.put("-15920","lie");  ht_PinYin.put("-15915","lin");  ht_PinYin.put("-15903","ling");  ht_PinYin.put("-15889","liu");  ht_PinYin.put("-15878","long");  ht_PinYin.put("-15707","lou");  ht_PinYin.put("-15701","lu");  ht_PinYin.put("-15681","lv");  ht_PinYin.put("-15667","luan");  ht_PinYin.put("-15661","lue");  ht_PinYin.put("-15659","lun");  ht_PinYin.put("-15652","luo");  ht_PinYin.put("-15640","ma");  ht_PinYin.put("-15631","mai");  ht_PinYin.put("-15625","man");  ht_PinYin.put("-15454","mang");  ht_PinYin.put("-15448","mao");  ht_PinYin.put("-15436","me");  ht_PinYin.put("-15435","mei");  ht_PinYin.put("-15419","men");  ht_PinYin.put("-15416","meng");  ht_PinYin.put("-15408","mi");  ht_PinYin.put("-15394","mian");  ht_PinYin.put("-15385","miao");  ht_PinYin.put("-15377","mie");  ht_PinYin.put("-15375","min");  ht_PinYin.put("-15369","ming");  ht_PinYin.put("-15363","miu");  ht_PinYin.put("-15362","mo");  ht_PinYin.put("-15183","mou");  ht_PinYin.put("-15180","mu");  ht_PinYin.put("-15165","na");  ht_PinYin.put("-15158","nai");  ht_PinYin.put("-15153","nan");  ht_PinYin.put("-15150","nang");  ht_PinYin.put("-15149","nao");  ht_PinYin.put("-15144","ne");  ht_PinYin.put("-15143","nei");  ht_PinYin.put("-15141","nen");  ht_PinYin.put("-15140","neng");  ht_PinYin.put("-15139","ni");  ht_PinYin.put("-15128","nian");  ht_PinYin.put("-15121","niang");  ht_PinYin.put("-15119","niao");  ht_PinYin.put("-15117","nie");  ht_PinYin.put("-15110","nin");  ht_PinYin.put("-15109","ning");  ht_PinYin.put("-14941","niu");  ht_PinYin.put("-14937","nong");  ht_PinYin.put("-14933","nu");  ht_PinYin.put("-14930","nv");  ht_PinYin.put("-14929","nuan");  ht_PinYin.put("-14928","nue");  ht_PinYin.put("-14926","nuo");  ht_PinYin.put("-14922","o");  ht_PinYin.put("-14921","ou");  ht_PinYin.put("-14914","pa");  ht_PinYin.put("-14908","pai");  ht_PinYin.put("-14902","pan");  ht_PinYin.put("-14894","pang");  ht_PinYin.put("-14889","pao");  ht_PinYin.put("-14882","pei");  ht_PinYin.put("-14873","pen");  ht_PinYin.put("-14871","peng");  ht_PinYin.put("-14857","pi");  ht_PinYin.put("-14678","pian");  ht_PinYin.put("-14674","piao");  ht_PinYin.put("-14670","pie");  ht_PinYin.put("-14668","pin");  ht_PinYin.put("-14663","ping");  ht_PinYin.put("-14654","po");  ht_PinYin.put("-14645","pu");  ht_PinYin.put("-14630","qi");  ht_PinYin.put("-14594","qia");  ht_PinYin.put("-14429","qian");  ht_PinYin.put("-14407","qiang");  ht_PinYin.put("-14399","qiao");  ht_PinYin.put("-14384","qie");  ht_PinYin.put("-14379","qin");  ht_PinYin.put("-14368","qing");  ht_PinYin.put("-14355","qiong");  ht_PinYin.put("-14353","qiu");  ht_PinYin.put("-14345","qu");  ht_PinYin.put("-14170","quan");  ht_PinYin.put("-14159","que");  ht_PinYin.put("-14151","qun");  ht_PinYin.put("-14149","ran");  ht_PinYin.put("-14145","rang");  ht_PinYin.put("-14140","rao");  ht_PinYin.put("-14137","re");  ht_PinYin.put("-14135","ren");  ht_PinYin.put("-14125","reng");  ht_PinYin.put("-14123","ri");  ht_PinYin.put("-14122","rong");  ht_PinYin.put("-14112","rou");  ht_PinYin.put("-14109","ru");  ht_PinYin.put("-14099","ruan");  ht_PinYin.put("-14097","rui");  ht_PinYin.put("-14094","run");  ht_PinYin.put("-14092","ruo");  ht_PinYin.put("-14090","sa");  ht_PinYin.put("-14087","sai");  ht_PinYin.put("-14083","san");  ht_PinYin.put("-13917","sang");  ht_PinYin.put("-13914","sao");  ht_PinYin.put("-13910","se");  ht_PinYin.put("-13907","sen");  ht_PinYin.put("-13906","seng");  ht_PinYin.put("-13905","sha");  ht_PinYin.put("-13896","shai");  ht_PinYin.put("-13894","shan");  ht_PinYin.put("-13878","shang");  ht_PinYin.put("-13870","shao");  ht_PinYin.put("-13859","she");  ht_PinYin.put("-13847","shen");  ht_PinYin.put("-13831","sheng");  ht_PinYin.put("-13658","shi");  ht_PinYin.put("-13611","shou");  ht_PinYin.put("-13601","shu");  ht_PinYin.put("-13406","shua");  ht_PinYin.put("-13404","shuai");  ht_PinYin.put("-13400","shuan");  ht_PinYin.put("-13398","shuang");  ht_PinYin.put("-13395","shui");  ht_PinYin.put("-13391","shun");  ht_PinYin.put("-13387","shuo");  ht_PinYin.put("-13383","si");  ht_PinYin.put("-13367","song");  ht_PinYin.put("-13359","sou");  ht_PinYin.put("-13356","su");  ht_PinYin.put("-13343","suan");  ht_PinYin.put("-13340","sui");  ht_PinYin.put("-13329","sun");  ht_PinYin.put("-13326","suo");  ht_PinYin.put("-13318","ta");  ht_PinYin.put("-13147","tai");  ht_PinYin.put("-13138","tan");  ht_PinYin.put("-13120","tang");  ht_PinYin.put("-13107","tao");  ht_PinYin.put("-13096","te");  ht_PinYin.put("-13095","teng");  ht_PinYin.put("-13091","ti");  ht_PinYin.put("-13076","tian");  ht_PinYin.put("-13068","tiao");  ht_PinYin.put("-13063","tie");  ht_PinYin.put("-13060","ting");  ht_PinYin.put("-12888","tong");  ht_PinYin.put("-12875","tou");  ht_PinYin.put("-12871","tu");  ht_PinYin.put("-12860","tuan");  ht_PinYin.put("-12858","tui");  ht_PinYin.put("-12852","tun");  ht_PinYin.put("-12849","tuo");  ht_PinYin.put("-12838","wa");  ht_PinYin.put("-12831","wai");  ht_PinYin.put("-12829","wan");  ht_PinYin.put("-12812","wang");  ht_PinYin.put("-12802","wei");  ht_PinYin.put("-12607","wen");  ht_PinYin.put("-12597","weng");  ht_PinYin.put("-12594","wo");  ht_PinYin.put("-12585","wu");  ht_PinYin.put("-12556","xi");  ht_PinYin.put("-12359","xia");  ht_PinYin.put("-12346","xian");  ht_PinYin.put("-12320","xiang");  ht_PinYin.put("-12300","xiao");  ht_PinYin.put("-12120","xie");  ht_PinYin.put("-12099","xin");  ht_PinYin.put("-12089","xing");  ht_PinYin.put("-12074","xiong");  ht_PinYin.put("-12067","xiu");  ht_PinYin.put("-12058","xu");  ht_PinYin.put("-12039","xuan");  ht_PinYin.put("-11867","xue");  ht_PinYin.put("-11861","xun");  ht_PinYin.put("-11847","ya");  ht_PinYin.put("-11831","yan");  ht_PinYin.put("-11798","yang");  ht_PinYin.put("-11781","yao");  ht_PinYin.put("-11604","ye");  ht_PinYin.put("-11589","yi");  ht_PinYin.put("-11536","yin");  ht_PinYin.put("-11358","ying");  ht_PinYin.put("-11340","yo");  ht_PinYin.put("-11339","yong");  ht_PinYin.put("-11324","you");  ht_PinYin.put("-11303","yu");  ht_PinYin.put("-11097","yuan");  ht_PinYin.put("-11077","yue");  ht_PinYin.put("-11067","yun");  ht_PinYin.put("-11055","za");  ht_PinYin.put("-11052","zai");  ht_PinYin.put("-11045","zan");  ht_PinYin.put("-11041","zang");  ht_PinYin.put("-11038","zao");  ht_PinYin.put("-11024","ze");  ht_PinYin.put("-11020","zei");  ht_PinYin.put("-11019","zen");  ht_PinYin.put("-11018","zeng");     ht_PinYin.put("-11014","zha");     ht_PinYin.put("-10838","zhai");     ht_PinYin.put("-10832","zhan");     ht_PinYin.put("-10815","zhang");     ht_PinYin.put("-10800","zhao");     ht_PinYin.put("-10790","zhe");     ht_PinYin.put("-10780","zhen");     ht_PinYin.put("-10764","zheng");     ht_PinYin.put("-10587","zhi");     ht_PinYin.put("-10544","zhong");     ht_PinYin.put("-10533","zhou");     ht_PinYin.put("-10519","zhu");     ht_PinYin.put("-10331","zhua");     ht_PinYin.put("-10329","zhuai");     ht_PinYin.put("-10328","zhuan");     ht_PinYin.put("-10322","zhuang");     ht_PinYin.put("-10315","zhui");     ht_PinYin.put("-10309","zhun");     ht_PinYin.put("-10307","zhuo");     ht_PinYin.put("-10296","zi");     ht_PinYin.put("-10281","zong");     ht_PinYin.put("-10274","zou");     ht_PinYin.put("-10270","zu");     ht_PinYin.put("-10262","zuan");     ht_PinYin.put("-10260","zui");     ht_PinYin.put("-10256","zun");     ht_PinYin.put("-10254","zuo");     ht_PinYin.put("-10247","zz");   }      file://文件、目录复制   public static void fileCopy(String from, String to, boolean overwrite) throws Exception{         File src = new File(from);         File dest = new File(to);         try {             FileInputStream fis = new FileInputStream(src);             FileOutputStream fos = new FileOutputStream(dest, !overwrite); 
            byte[] buf = new byte[512];             int size = fis.read(buf);             while(size != -1) {                 fos.write(buf, 0, size);                 size = fis.read(buf);             }             fis.close();              fos.close();         }catch (FileNotFoundException fnfe){             if(src.isDirectory()) {             /* 原文件是目录 复制目录*/                 File[] files = src.listFiles();                 Stack stack = new Stack();                 for(int i = 0; i < files.length; i++) {                                         dest.mkdirs();                     System.out.println( files[i ]. getName() );                     fileCopy(src + File.separator + files[ i].getName(), to + File.separator + files[ i].getName(), overwrite);                 }             }else{             /* 原文件不存在或其它异常情况, 抛出异常*/                 throw new Exception("原文件不存在或其它异常情况!");             }         }catch (IOException e) {              /* 未知的I/O异常 */             throw new Exception("未知的I/O异常!");         }   } // end fileCopy() 
  //       } // end class  
 
  |