??xml version="1.0" encoding="utf-8" standalone="yes"?>4480yy私人影院亚洲,久久久亚洲欧洲日产国码农村,亚洲综合无码一区二区痴汉 http://m.tkk7.com/human2008/zh-cnMon, 12 May 2025 16:19:21 GMTMon, 12 May 2025 16:19:21 GMT60MyEclipse使用技?/title><link>http://m.tkk7.com/human2008/archive/2008/02/18/180537.html</link><dc:creator>?</dc:creator><author>?</author><pubDate>Mon, 18 Feb 2008 13:09:00 GMT</pubDate><guid>http://m.tkk7.com/human2008/archive/2008/02/18/180537.html</guid><wfw:comment>http://m.tkk7.com/human2008/comments/180537.html</wfw:comment><comments>http://m.tkk7.com/human2008/archive/2008/02/18/180537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/human2008/comments/commentRss/180537.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/human2008/services/trackbacks/180537.html</trackback:ping><description><![CDATA[<p>E序代码自动排版QCtrl+Shift+FQ会自动把代码进行格式化的排版,非常方便<br /> 快速执行程序:Ctrl + F11W一ơ执行时Q它会询问您执行模式Q设|好后,以后只要按这个热键,它就会快速执行?/p> <p>Ctrl+Shift+/ 加上D|?**/</p> <p>Ctrl+Shift+\ 取消D|?**/</p> <p>Ctrl+/ 加上行注释或取消行注?/p> <p>自动汇入所需要的cdQCtrl+Shift+O</p> <p>取消自动validationQ?br /> 取消ҎQ?nbsp;windows-->perferences-->myeclipse-->validation <br /> 除开Manual下面的复选框全部选中之外Q其他全部不?nbsp;<br /> 手工验证ҎQ?nbsp;<br /> 在要验证的文件上Q单击鼠标右?->myeclipse-->run validation </p> <p>按new Remote Site,Name?<strong>svn</strong> , URL?a >http://subclipse.tigris.org/update</a>,一直next到finished为止</p> <img src ="http://m.tkk7.com/human2008/aggbug/180537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/human2008/" target="_blank">?</a> 2008-02-18 21:09 <a href="http://m.tkk7.com/human2008/archive/2008/02/18/180537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个提高代码质量,查代码规范的工具 http://m.tkk7.com/human2008/archive/2008/01/11/174509.html??Fri, 11 Jan 2008 01:48:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174509.htmlhttp://m.tkk7.com/human2008/comments/174509.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174509.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174509.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174509.html1.FindBugs:查错
 目前版本0.9.1,有for eclipse的插? |址?a >http://findbugs.sourceforge.net.
 
 工作原理:查程序生成的class的工?
 
 界面:独立q行的提供图形界?很友?有bug报告.
 
 可用?大多数提C有?值得?br />  
 插g:
  可以讄基本和检查的错误cd.
  插g保存讄有问?我是关闭目后台修改了配|文?在装入才成功改了配置?
  bug临时解决: 使用独立的findbugs讄规则,然后到C:\Documents and Settings\XXX\下找.Findbugs_prefs,然后改名覆盖eclipse project下的.fbprefs (先关闭你的project)
 
 配置没有查找功能,不过~写能让我们很快扑ֈ某个规则
 
2.PMD:主要是查?/strong>
 目前版本3.2,有for eclipse以及其他ide的插?|址?a >http://pmd.sourceforge.net
 工作原理:查源?
 可用?一部分值得修改,有些q于严格
 界面:独立q行的是命o行界?命o比较?
 插g:可以配置规则,有一个独立的H口昄提示,?U提C?很友?br />  
 使用:建立自己的规?然后用于实际使用?
 
3.CheckStyle:主要查代码规?/strong>
 目前版本4.0 beta 5,有for eclipse的插?|址?a >http://checkstyle.sourceforge.net.
 工作原理:查源?对javadoc,书写格式{进行检?
 规则定义:默认的规则是sun的编码规?不过按照sun的规则则q于严格,而且每个公司也有自己的规?和sun的不?所以需要自定义规范. 

4.JTest 重量U的商业工具
 目前版本7.0.7,有for eclipse的插?|址?a >http://www.parasoft.com/
 
 不推荐?不过功能强大,可以q行代码?可以自动生成单元试和进行单元测?(不过是太慢?而且生成的单元测试没太大用?
 
 
 

使用感觉:

 安装上插件后,对自q目q行?发现警告太多?有点发蒙的感?不过把警告看一?觉得都很有道?有些也确实是一些错?
 当然PMD和CheckStyle的规范太严格,最后还是配|了一?
 
 通过Ҏ警告,感觉q是不错,臛_可以说自q代码可以通过工具的检了.
 
 当然基础代码和项目代码还是不一L,基础代码往往比较复杂,所以和普通项目代码的规范应该有所不同.有些规则只能用在普通代码上,用在基础cM码上往往没法处理.
 
其他

代码查错推荐使用Findbugs和PMD,代码书写规范推荐使用CheckStyleq行?q样不仅能查Z些基本的错误,也能提高目的代码质?Ҏ高自q代码水^也是非常?

推荐目l徏立统一的规?代码复查的时候就使用q些工具,省时省力.

实乃居家旅行,杀货必备之工具?(因ؓ肯定有h要骂?呵呵,也是你找"?的工?



? 2008-01-11 09:48 发表评论
]]>
使用Luceneq行全文?一)---处理索引 http://m.tkk7.com/human2008/archive/2008/01/11/174507.html??Fri, 11 Jan 2008 01:47:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174507.htmlhttp://m.tkk7.com/human2008/comments/174507.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174507.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174507.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174507.htmlhttp://lucene.apache.org.相关的一个项目是车东的WebLucene: http://sourceforge.net/projects/weblucene.

 首先,Z一个简单的新闻pȝ,要想做全文检?新闻pȝ的管理等在这里不在具体提?下面列出新闻对象的类:
 
 ?E序用会C些工L,不在此列?用户可以自己实现.
 
 

  package com.jscud.website.newsinfo.bean;
  
  
  import java.sql.Timestamp;
  
  import com.jscud.util.DateTime;
  import com.jscud.util.StringFunc;
  import com.jscud.website.newsinfo.NewsConst;
  
  
  /**
   * 一个新?
   *
   * @author scud(飞云侠) http://www.jscud.com
   * 
   */
  public class NewsItem
  {
  
      private int nid; //新闻~号
  
      private int cid; //cd~号
  
      private String title;//标题
  
      private int showtype; //内容cd:目前支持url和html
  
      private String content;//内容
  
      private String url;//对应|址,如果内容cd是url的话
  
      private Timestamp addtime; //增加旉
  
      private int click; //点击?br />      
      //对应的get,set函数,较多不在列出,可以使用工具生成
      //......
  
     
      /**
       * 按照cd格式?br />        */
      public String getShowContent()
      {
          String sRes = content;
          if(showtype == NewsConst.ShowType_HTML)
          {
          }  
          return sRes;
      }
     
      public String getTarget()
      {
          if(showtype == NewsConst.ShowType_URL)
          {
              return "_blank";
          }
          else
              return "";       
      }
     
      /**
       * 静态Html文g的\径及其名?br />        */
      public String getHtmlFileName()
      {
          int nYear = DateTime.getYear_Date(getAddtime());
          int nMonth =  DateTime.getMonth_Date(getAddtime());
             
          String sGeneFileName =
             "/news/" + getCid() + "/" + nYear + "/" + nMonth +"/" + getNid() + ".htm";
         
          return sGeneFileName;
      }
     
      /**
       * 静态Html文g的\?br />        */
      public String getHtmlFilePath()
      {
          int nYear = DateTime.getYear_Date(getAddtime());
          int nMonth =  DateTime.getMonth_Date(getAddtime());
             
          String sGeneFilePath =
             getCid() + "_" + nYear + "_" + nMonth;
         
          return sGeneFilePath;
      }     
  } 


 
 可以看到,我们需要对标题和内容进行检?Zq个目的,我们首先需要来研究一下lucene.
 
 在Lucene?如果要进行全文检?必须要先建立索引然后才能q行?当然实际工作中还会有删除索引和更新烦引的工作.
 
 在此之前,介绍一个最基本的类(摘抄?a href="http://m.tkk7.com/cap/archive/2005/07/17/7849.html">http://m.tkk7.com/cap/archive/2005/07/17/7849.html):
 
 Analyzer 文g的分析器Q听h别扭Q还是叫Analyzer好了)的抽象,q个cȝ来处理分?对中文尤光要,转换大小?Computer->computer,实现查询大小写无?Q{换词?computers->computer),消除stop words{?q负责把其他格式文档转换为纯文本{?
 
 在lucene?一般会使用StandardAnalyzer来分析内?它支持中文等多字节语a,当然可以自己实现Ҏ的解析器.StandardAnalyzer目前对中文的处理是按照单字来处理?q是最单的办法,但是也有~点,会组合出一些没有意义的l果? 
 
 
 首先我们来了解徏立烦?建立索引包含2U情?一U是l一条新d立烦?另外的情冉|在开始或者一定的旉l批量的新闻建立索引,所以ؓ了通用,我们写一个通用的徏立烦引的函数:
 
 (一般一cȝ索引都放在一个目录下,q个配置可以在函C定义,也可以写在配|文件中,通过参数传递给函数.)

    /**
     * 生成索引.
     *
     * @param doc 目标文档
     * @param indexDir 索引目录
     */
    public static void makeIndex(Document doc, String indexDir)
    {
        List aList = new ArrayList();
        aList.add(doc);
        makeIndex(aList, indexDir);
    }
 
    /**
     * 生成索引.
     *
     * @param doc 生成的document.
     * @param indexDir 索引目录
     */
    public static void makeIndex(List docs, String indexDir)
    {
        if (null == docs)
        {
            return;
        }       
        boolean indexExist = indexExist(indexDir);

        IndexWriter writer = null;
        try
        {
            StandardAnalyzer analyzer = new StandardAnalyzer();
           
            //如果索引存在,p?如果不存?徏立新的烦?lucene要是自动判决好?
            if(indexExist)
            {
                writer = new IndexWriter(indexDir, analyzer, false);
            }
            else
            {
                writer = new IndexWriter(indexDir, analyzer, true);
            }

            //d一条文?br />             for (int i = 0; i < docs.size(); i++)
            {
                Document doc = (Document) docs.get(i);
                if (null != doc)
                {
                    writer.addDocument(doc);
                }
            }

            //索引完成后的处理
            writer.optimize();
        }
        catch (IOException e)
        {
            LogMan.warn("Error in Make Index", e);
        }
        finally
        {
            try
            {
                if (null != writer)
                {
                    writer.close();
                }
            }
            catch (IOException e)
            {
                LogMan.warn("Close writer Error");
            }
        }
    }



 可以看到,建立索引用到cLIndexWrite,它可以新建烦引或者追加烦?但是需要自己判?判断是通过IndexReaderq个cL实现?函数如下:

 

  /**
     * 查烦引是否存?
     * @param indexDir
     * @return
     */
    public static boolean indexExist(String indexDir)
    {
        return IndexReader.indexExists(indexDir);
    }
 


 如果每次都是新徏索引的话,会把原来的记录删?我在使用的时候一开始就没有注意?后来观察了一下烦引文?才发现这个问?
 
 
 q可以看?建立索引是给用户的Document对象建立索引,Document表示索引中的一条文档记?那么我们如何建立一个文档那?以新ȝlؓ?代码如下:
 

     /**
      * 生成新闻的Document.
      *
      * @param aNews 一条新?
      *
      * @return lucene的文档对?br />       */
     public static Document makeNewsSearchDocument(NewsItem aNews)
     {
         Document doc = new Document();
 
         doc.add(Field.Keyword("nid", String.valueOf(aNews.getNid())));
 
         doc.add(Field.Text("title", aNews.getTitle()));
        
         //对Htmlq行解析,如果不是html,则不需要解?或者根据格式调用自q解析Ҏ
         String content = parseHtmlContent(aNews.getContent());
 
         doc.add(Field.UnStored("content", content));
 
         doc.add(Field.Keyword("addtime", aNews.getAddtime()));
 
         //可以加入其他的内?例如新闻的评论等
         doc.add(Field.UnStored("other", ""));
 
         //讉Kurl
         String newsUrl = "/srun/news/viewhtml/" + aNews.getHtmlFilePath() + "/" + aNews.getNid()
                         + ".htm";
 
         doc.add(Field.UnIndexed("visiturl", newsUrl));
 
         return doc;
     }


 
 通过上面的代?我们把一条新闻{换ؓlucene的Document对象,从而进行烦引工?在上面的代码?我们又引入了lucene中的Field(字段)c?Document文档像数据库中的一条记?它有很多字段,每个字段是一个Field对象.
 
 从别的文章摘抄一D关于Field的说?摘抄?a href="http://m.tkk7.com/cap/archive/2005/07/17/7849.html">http://m.tkk7.com/cap/archive/2005/07/17/7849.html):
 [quote]
    cd                               Analyzed Indexed Stored 说明
    Field.Keyword(String,String/Date)  N Y Y                    q个Field用来储存会直接用来检索的比如(~号,姓名,日期{?
    Field.UnIndexed(String,String)     N N Y                    不会用来索的信息,但是索后需要显C的,比如,g序列?文档的url地址
    Field.UnStored(String,String)      Y Y N                    大段文本内容,会用来检?但是索后不需要从index中取内容,可以Ҏurl去load真实的内?
    Field.Text(String,String)          Y Y Y                    ?获取都需要的内容,直接放index?不过q样会增大index
    Field.Text(String,Reader)          Y Y N                    如果是一个Reader, lucene猜测内容比较?会采用Unstored的策?
 [/quote]
 
 我们可以看到新闻的编h直接用来索的,所以是Keywordcd的字D?新闻的标题是需要检索和昄用的,所以是Textcd,而新ȝ内容因ؓ是Html格式?所以在l过解析器的处理?使用的UnStored的格?而新ȝ旉是直接用来检索的,所以是KeyWordcd.Z在新ȝ引后用户可以讉K到完整的新闻面,q设|了一个UnIndexedcd的访问地址字段.
 
 (对Htmlq行解析的处理稍后在q行讲解)
 
 Z条新d立烦引需要两个步?获取Document,传给makeIndex函数,代码如下:

    public static void makeNewsInfoIndex(NewsItem aNews)
    {
        if (null == aNews)
        {
            return;
        }
        makeIndex(makeNewsSearchDocument(aNews),indexDir);
    }  


 

 
 
 建立索引的工作就q行完了,只要在增加新d调用 makeNewsInfoIndex(newsitem); 可以徏立烦引了.
 
 如果需要删除新?那么也要删除对应的烦?删除索引是通过IndexReadercL完成?
 


    /**
     * 删除索引.
     * @param aTerm 索引删除条g
     * @param indexDir 索引目录
     */
    public static void deleteIndex(Term aTerm, String indexDir)
    {
        List aList = new ArrayList();
        aList.add(aTerm);
        deleteIndex(aList, indexDir);
    }

    /**
     * 删除索引.
     *
     * @param aTerm 索引删除条g.
     * @param indexDir 索引目录
     * 
     */
    public static void deleteIndex(List terms, String indexDir)
    {
        if (null == terms)
        {
            return;
        }
       
        if(!indexExist(indexDir)) { return; }

        IndexReader reader = null;
        try
        {
            reader = IndexReader.open(indexDir);
            for (int i = 0; i < terms.size(); i++)
            {
                Term aTerm = (Term) terms.get(i);
                if (null != aTerm)
                {
                    reader.delete(aTerm);
                }
            }
        }
        catch (IOException e)
        {
            LogMan.warn("Error in Delete Index", e);
        }
        finally
        {
            try
            {
                if (null != reader)
                {
                    reader.close();
                }
            }
            catch (IOException e)
            {
                LogMan.warn("Close reader Error");
            }
        }
    } 


 
 删除索引需要一个条?cM数据库中的字D|?例如删除一条新ȝ代码如下:
 

     public static void deleteNewsInfoIndex(int nid)
     {
         Term aTerm = new Term("nid", String.valueOf(nid));
         deleteIndex(aTerm,indexDir);
     }   




 通过新闻的ID,可以删除一条新?
 
 如果需要更新新?如何更新索引? 更新索引需要先删除索引然后新徏索引2个步?其实是把上面的代码l合h,例如更新一条新?

     public static void updateNewsInfoIndex(NewsItem aNews)
     {
         if (null == aNews)
         {
             return;
         }
         deleteNewsInfoIndex(aNews.getNid());
         makeNewsInfoIndex(aNews);
     } 
 



 
 x,索引的徏立更新和删除告一D落?其中扚w更新新闻的代码如?
 (扚w更新应该在访问h数少或者后台程序在夜间执行)

    public static void makeAllNewsInfoIndex(List newsList)
    {
        List terms = new ArrayList();
        List docs = new ArrayList();

        for (int i = 0; i < newsList.size(); i++)
        {
            NewsItem aitem = (NewsItem) newsList.get(i);
            if (null != aitem)
            {
                terms.add(new Term("nid", String.valueOf(aitem.getNid())));
                docs.add(makeNewsSearchDocument(aitem));
            }
        }

        deleteIndex(terms,indexDir);
        makeIndex(docs,indexDir);
    } 



? 2008-01-11 09:47 发表评论
]]>
分析/解析Html面:HTML Parser的试?http://m.tkk7.com/human2008/archive/2008/01/11/174505.html??Fri, 11 Jan 2008 01:45:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174505.htmlhttp://m.tkk7.com/human2008/comments/174505.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174505.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174505.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174505.html最q在研究lucene的全文检?在很多地斚w要解析或者说分析Html内容或者Html面,Lucene本n的演C程序中也提供了一个Html Parser,但是不是UJava的解x?于是到处搜烦,在网上找C一?HTMLParser".

|址? http://htmlparser.sourceforge.net ,当前版本?.5.

下蝲下来,试用一?感觉不错,完全能满lucene解析Html的需?

q几天脓出luceneq行全文索的代码.(索本站的文章{?.

试用代码如下,供大家参?

package com.jscud.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.TextExtractingVisitor;

import com.jscud.util.LogMan; //一个日志记录类

/**
 * 演示了Html Parse的应?
 *
 * @author scud http://www.jscud.com
 */

public class ParseHtmlTest
{

    public static void main(String[] args) throws Exception
    {
        String aFile = "e:/jscud/temp/test.htm";

        String content = readTextFile(aFile, "GBK");

        test1(content);
        System.out.println("====================================");

        test2(content);
        System.out.println("====================================");

        test3(content);
        System.out.println("====================================");

        test4(content);
        System.out.println("====================================");

        test5(aFile);
        System.out.println("====================================");

        //讉K外部资源,相对?br />         test5("         System.out.println("====================================");

    }

    /**
     * d文g的方式来分析内容.
     * filePath也可以是一个Url.
     *
     * @param resource 文g/Url
     */
    public static void test5(String resource) throws Exception
    {
        Parser myParser = new Parser(resource);

        //讄~码
        myParser.setEncoding("GBK");

        HtmlPage visitor = new HtmlPage(myParser);

        myParser.visitAllNodesWith(visitor);

        String textInPage = visitor.getTitle();

        System.out.println(textInPage);
    }

    /**
     * 按页面方式处?对一个标准的Html面,推荐使用此种方式.
     */
    public static void test4(String content) throws Exception
    {
        Parser myParser;
        myParser = Parser.createParser(content, "GBK");

        HtmlPage visitor = new HtmlPage(myParser);

        myParser.visitAllNodesWith(visitor);

        String textInPage = visitor.getTitle();

        System.out.println(textInPage);
    }

    /**
     * 利用Visitor模式解析html面.
     *
     * 优?译?lt;>{符?
     * ~点:好多I格,无法提取link
     *  
     */
    public static void test3(String content) throws Exception
    {
        Parser myParser;
        myParser = Parser.createParser(content, "GBK");

        TextExtractingVisitor visitor = new TextExtractingVisitor();

        myParser.visitAllNodesWith(visitor);

        String textInPage = visitor.getExtractedText();

        System.out.println(textInPage);
    }

    /**
     * 得到普通文本和链接的内?
     *
     * 使用了过滤条?
     */
    public static void test2(String content) throws ParserException
    {
        Parser myParser;
        NodeList nodeList = null;

        myParser = Parser.createParser(content, "GBK");

        NodeFilter textFilter = new NodeClassFilter(TextNode.class);
        NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

        //暂时不处?meta
        //NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);

        OrFilter lastFilter = new OrFilter();
        lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

        nodeList = myParser.parse(lastFilter);

        Node[] nodes = nodeList.toNodeArray();

        for (int i = 0; i < nodes.length; i++)
        {
            Node anode = (Node) nodes[i];

            String line = "";
            if (anode instanceof TextNode)
            {
                TextNode textnode = (TextNode) anode;
                //line = textnode.toPlainTextString().trim();
                line = textnode.getText();
            }
            else if (anode instanceof LinkTag)
            {
                LinkTag linknode = (LinkTag) anode;

                line = linknode.getLink();
               
//@todo qojsp标签:可以自己实现q个函数
                //line = StringFunc.replace(line, "<%.*%>", "");
            }

            if (isTrimEmpty(line))
                continue;

            System.out.println(line);
        }
    }

    /**
     * 解析普通文本节?
     *
     * @param content
     * @throws ParserException
     */
    public static void test1(String content) throws ParserException
    {
        Parser myParser;
        Node[] nodes = null;

        myParser = Parser.createParser(content, null);

        nodes = myParser.extractAllNodesThatAre(TextNode.class); //exception could be thrown here

        for (int i = 0; i < nodes.length; i++)
        {
            TextNode textnode = (TextNode) nodes[i];
            String line = textnode.toPlainTextString().trim();
            if (line.equals(""))
                continue;
            System.out.println(line);
        }

    }

    /**
     * d一个文件到字符串里.
     *
     * @param sFileName  文g?br />      * @param sEncode   String
     * @return 文g内容
     */
    public static String readTextFile(String sFileName, String sEncode)
    {
        StringBuffer sbStr = new StringBuffer();

        try
        {
            File ff = new File(sFileName);
            InputStreamReader read = new InputStreamReader(new FileInputStream(ff),
                    sEncode);
            BufferedReader ins = new BufferedReader(read);

            String dataLine = "";
            while (null != (dataLine = ins.readLine()))
            {
                sbStr.append(dataLine);
                sbStr.append("\r\n");
            }

            ins.close();
        }
        catch (Exception e)
        {
            LogMan.error("read Text File Error", e);
        }

        return sbStr.toString();
    }

    /**
     * L左右I格后字W串是否为空
     * @param astr String
     * @return boolean
     */
    public static boolean isTrimEmpty(String astr)
    {
        if ((null == astr) || (astr.length() == 0))
        {
            return true;
        }
        if (isBlank(astr.trim()))
        {
            return true;
        }
        return false;
    }

    /**
     * 字符串是否ؓI?null或者长度ؓ0.
     * @param astr 源字W串.
     * @return boolean
     */
    public static boolean isBlank(String astr)
    {
        if ((null == astr) || (astr.length() == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

}

 




? 2008-01-11 09:45 发表评论
]]>
JavaEE事务扫盲W记之一扫扫到尾 http://m.tkk7.com/human2008/archive/2008/01/11/174503.html??Fri, 11 Jan 2008 01:44:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174503.htmlhttp://m.tkk7.com/human2008/comments/174503.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174503.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174503.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174503.html1.资料

2.本地事务与分布式事务

  • 本地事务
    完全依赖于DB、JMS自nQ,如直接调用jdbc中的conn.commit();q里没应用服务器什么事Q所以也不支持多数据源的全局事务?
  • 分布式事?/strong>
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现?br /> JTA是用LE接口,JTS是服务器底层服务Q两者一般由应用服务器自带实玎ͼ?span class="nobr">atomikos ?span class="nobr">JOTM ?span class="nobr">JBoss Transaction 是专门搞局抢生意的?br /> XA Sources其实先于JavaEE而存在,JDBC driver必须有javax.sql.XADataSource接口的实现类Q否则所谓二阶段提交是个伪能力?br /> JavaEE除了支持JDBC和JMS外,q引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型,因此像JDOq类框架/Server是靠乖乖出自己的JCAq接器来参与JavaEE事务的?/li>

3.~程式模?/h2>

    手工调用jdbc的connection事务Ҏ和用JTA接口都属于编E式开发,在EJB中叫BMT(Bean理事务)?br />     JTA最重要的接口就是UserTransaction和它的六个方?beginQcommitQrollbackQgetStatusQsetRollbackonlyQsetTransactionTimeout?br />     E序需要UserTransaction时可以从JNDI领取Q不qJNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入?/p>

4.宣告式模?/h2>

    前面都是铺垫Q这个才是主打的事务模型Q如EJB的CMT(容器理事务)和Sprin?/p>

    其中EJB2.0QSpring1.0在部|描q符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation?/p>

4.1 事务cd

     q里JavaEE与Spring的定义基本相同:

  • RequiredQ如果Context中有事务加入,没有p己创Z个?最常用讄)
  • MandatoryQ永q加入一个事务。如果当前Context没有事务Q抛出异常?那些不打自p责rollback事务的方法,必须加入到别人的事务Q由别h来控制rollback)
  • RequiresNewQ永q新Z个事务?那些不管别h如何Q自己必L交事务的ҎQ比如审计信息是一定要写的)
  • SupportsQ如果有事务加入,如果没有q了。永q不会创建新事务?一般用于只L法,不会d创徏事务Q但如果当前有事务就加入Q以d事务中未提交的数?
  • NotSupportedQ永q不使用事务Q如果当前有事务Q挂起事务?那些有可能抛异常但异常ƈ不媄响全局的方?
  • NeverQ不能在有当前事务的情况下调用本Ҏ。(生h勿近?)

      可见QRequired是默认的讄QSupports是只L法的最佳选择?/p>

4.2 事务隔离U别

  • ReadUncommitedQ本事务可以看到另一事务未提交的数据。脏诅R?
  • ReadCommitedQ本事务只可以看到另一事务已提交的数据。不可重复读?
  • RepeatableReadQ可重复诅R在一个事务内Q第一ơ读到的数据Q在本事务没有提交前Q无论另一个事务如何提交数据,本事务读到的数据都是不变的?
  • SerializableQ串行化Q同时只有一个事务能ȝ同的数据?/li>

    U别低安全效率也低。隔ȝ别需要相兌源支持,如重复读在Oracle里会降为ReadCommited。Spring里默认的DefaultU别完全看数据源的脸色行事?/p>

4.3 关于Rollback

    EJB里,想rollback只能sessionContext.setRollbackOnly()Q或者抛出EJBException?EJB3q可以annotation讄某些自定义Exception可以触发rollback)

    在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子c?Q而checked exception(Exception及子c?是不会rollback的,除非你特别声明?/p>

   @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})

    因此所有在service层方法中用throws定义的ExceptionQ都必须在事务定义中q行rollback讑֮?请勿善忘)

    所有在service层方法中c被atch处理了的异常Q又希望容器辅助rollback的话Q必重抛一个预定义的RuntimeException的子cR?请勿回望)

4.4 关于Spring

    Spring不希望编E式事务理?br />     Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJOQ依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较ȝQ必MؓEJBException或手工setRollbackOnly())?br />     因此Spring通过AOP实现了对POJO的整套宣告式事务体系Q对jdbc,hibernate,jpa,jms{local数据源和JTA实现了统一的事务管理机Ӟ而且支持本地资源与JTA在配|文件的切换,而且改进了rollback机制?/p>

   1Q一个本C务管理器Q?/p>

<bean id="transactionManager"  class="org.springframework.orm.jpa.JpaTransactionManager">  <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>

   2QSpring׃把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)?/p>

<bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

   3Q应用服务器专有的类型的JTA事务理器:

<bean id="myTxManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>



? 2008-01-11 09:44 发表评论
]]>
包装你的SessionQSession对象?http://m.tkk7.com/human2008/archive/2008/01/11/174498.html??Fri, 11 Jan 2008 01:36:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174498.htmlhttp://m.tkk7.com/human2008/comments/174498.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174498.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174498.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174498.html
 int userAge = (int)this.Session["UserAge"];
    
    我们知道QSession中存攄是键值对Q键是stringcd的,如果我们一不小心把上面的语句写成这P
  int userAge = (int)this.Session["UseAge"];
    ~译期不会发现这个错误,但运行时一定会抛出异常Q这是在E序中直接操作Session可能引发的问题之一。另外,每次获取userAge的时候都要写代码q行强制转换Q感觉很J琐。我们需要一个解x案来解决q些问题。我的做法是引入一个Session的包装,使之对象化、强cd化。就像接下来的例子一P
public class SessionHelper
{
    
private HttpSessionState curSession;

    
public SessionHelper(HttpSessionState session)
    {
        
this.curSession = session;
    }

    
public static SessionHelper CreateInstance(HttpSessionState session)
    {        
        
return new SessionHelper(session);
    }


    
public string UserID
    {
        
get
        {
            
return this.curSession["UserID"].ToString();
        }
        
set
        {
            
this.curSession["UserID"= value ;
        }
    }

    
public int UserAge
    {
        
get
        {
            
return (int)this.curSession["UserAge"];
        }
        
set
        {
            
this.curSession["UserAge"= value ;
        }
    }

    
//某用户上传的所有图?/span>
    public ArrayList PicList
    {
        
get
        {
            
if (this.curSession["PicList"== null)
            {
                
this.curSession["PicList"= new ArrayList();
            }

            
return (ArraayList)this.curSession["PicList"];
        }       
    }

    
//清空囄列表
    public void ClearAllPics()
    {
        
this.PicList.Clear();
    }  
}

    q样Q我们用h非常方便了Q?br />
       SessionHelper sessionHelper = SessionHelper.CreateInstance(this.Session);
        ArrayList picList 
= sessionHelper.PicList;
        
//    处理picList中的囄
        sessionHelper.ClearAllPics();  

    引入q一层包装,可以使我们的E序的可L、可l护性更好,而且原来的一些运行期的错误提前到了编译期Q这也是强类型带来的好处?br />

? 2008-01-11 09:36 发表评论
]]>
Java Q- 在Eclipse上用Hibernate http://m.tkk7.com/human2008/archive/2008/01/11/174496.html??Fri, 11 Jan 2008 01:34:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174496.htmlhttp://m.tkk7.com/human2008/comments/174496.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174496.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174496.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174496.html
 Q?Q下载HibernateQƈ向项目中导入Hibernate?br />      Project->Properies->Java Build Path->Libraries->Add External JARs...Q选择Hibernate根目录下的hibernate3.jarQ添加到目中?br />     接着Q要Hibernate下的lib文g夹下的所有文仉作ؓ一个User Libraryd到项目中Q否则,如果仅仅dhibernate3.jarQ编译可以通过Q运行却会抛出ClassNotDef的异常,因ؓhibernate3.jar依赖于Hibernate下的lib文g夹下的文件?br />
 2Q我们的应用的后台数据库使用的是OracleQ所以首先要在例子项目中引入含有Oracle jdbc driver的包Qclasses12.jar。该jar文g位于oracle安装目录的jdbc\lib目录下?br />     在Eclipse中,Project->Properies->Java Build Path->Libraries->Add External JARs...Q选择classes12.jarQ将其添加到目中?br />     
Q?Q生成hibernate.cfg.xml文g?br />     通常Hibernate的配|文件和.hbm.xml文g都可以自动生成,q种自动生成的工具很多,我用的是HibernateSynchronizerQ它可以作ؓ一个插件添加到Eclipse中。当HibernateSynchronizer插g正确加蝲后,我们可以向当前项目中dHibernate配置文gQFile->New->Other->Hibernate->Hibernate Configuration FileQ出现如下界面:


  注意QDriver Class要选择针对Oracle的oracle.jdbc.driver.OracleDriverQ而且Database URL的格式也要正,如:
jdbc:oracle:thin:@10.8.8.221:1521:ORCL

    最好将hibernate.cfg.xml文g存放于项目的根目录下?br />
 4Q生?hbm.xml文g。File->New->Other->Hibernate->Hibernate Mapping FileQ出现如下界面:

     
    在填写完Password后,点击Refresh按钮Q就会在Tables中列出所有可以访问的数据库表Q然后选中要ؓ其生?hbm.xml文g的表Q点击FinishQ即会生成对应的.hbm.xml文gQ比如我上面选择的是Mobileuser表,׃生成Mobileuser.hbm.xml文g?br />
Q?Q从.hbm.xml文g自动生成实体cR?br />     在Package Explorer中选中Mobileuser.hbm.xml文gQ右?>Hibernate Synchronizer->Synchronize Files Q即可生成对应的实体cdDAOcR如果你仅仅惌实体c,那么可以在Project->Properies->Hibernate Synchronizer->Data Access Objects Q将“I would like to have DAOs created for me”的钩选项L卛_?br />
Q?Q在hibernate.cfg.xml文g中添加对应的mapping resource?br />     在Package Explorer中选中Mobileuser.hbm.xml文gQ右?>Hibernate Synchronizer->Add Mapping ReferenceQ即会在
hibernate.cfg.xml中自动生成如下配|:

<mapping resource="HibernateTest/Mobileuser.hbm.xml" />

Q?Q修改自动生成的hibernate.cfg.xml文g。需要在hibernate.cfg.xml文g的首部添加:

<!DOCTYPE hibernate-configuration PUBLIC
        
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    比较J琐的是Q每ơ自动修改hibernate.cfg.xml文g后,都要重新dq个xml片断?br />
    万事具备Q现在可以写个测试来验一下了Q?/p>

    //仅仅作ؓCZQ没有进行异常处?/span>
    public static void main(String[] args)
    {
        Configuration cfg 
= new Configuration().configure() ;        
        SessionFactory  sFactory 
= cfg.buildSessionFactory() ;        
        
        Session session 
= sFactory.openSession() ;
        Transaction tx 
= session.beginTransaction();
        Mobileuser user 
= (Mobileuser)session.load(Mobileuser.class , new Integer(2)) ;
        String age 
= user.getMobilenumber() ;
        
        System.
out.println(age) ;
        tx.commit();
        session.close() ;
    }


? 2008-01-11 09:34 发表评论
]]>
Java Q- 在Eclipse上用Spring http://m.tkk7.com/human2008/archive/2008/01/11/174495.html??Fri, 11 Jan 2008 01:33:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174495.htmlhttp://m.tkk7.com/human2008/comments/174495.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174495.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174495.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174495.html上一文?/a>介绍了如何在Eclipse上用Hibernate的入门,本文q单介l一下如何在Eclipse使用Spring?br />
    Q?Q首先,是下载SpringQ可以从sourceforge上下载,http://sourceforge.net/projects/springframework。目前的最新的可以下蝲 spring-framework-1.2.8-with-dependencies.zip ?br />
    Q?Q然后,可以Spring引入C的项目中?br />     先将spring-framework-1.2.8-with-dependencies.zip解压Q将其中的spring.jarQdist目录中)、commons-logging.jarQlib\jakarta-commons目录Q、log4j-1.2.13.jarQlib\log4j目录Q这三个文g复制到的”D:\java\Spring\lib" 目录中,然后在Eclipse中徏立一?#8220;Spring”库,那三个文gdq?#8220;Spring”库中?br />
    Q?Q测试一下:
    新徏两个c,Student和Book?br />
public class Book 
{
    
private int id = 0 ;
    
private String bookName ;
    
public String getBookName() {
        
return bookName;
    }
    
public void setBookName(String bookName) {
        
this.bookName = bookName;
    }
    
public int getId() {
        
return id;
    }
    
public void setId(int id) {
        
this.id = id;
    }
}

public class Student 
{
    
private int age = 0;    
    
private String name ;
    
private Book book ;

    
public int getAge() {
        
return age;
    }

    
public void setAge(int age) {
        
this.age = age;
    }
    
    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public Book getBook() {
        
return book;
    }

    
public void setBook(Book book) {
        
this.book = book;
    }
    
    
public String GetBookName()
    {
        
return this.book.getBookName() ;
    }    
}

    然后dSpring配置文gbean.xmlQbean.xml必须在CLASSPATH可以存取到的目录中)Q?br />
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    
<bean id="student" class="com.springTest.Student">
        
<property name="age">
            
<value>22</value>
        
</property>
        
<property name="name">
            
<value>Sky</value>
        
</property>
        
<property name="book" ref="book">            
        
</property>
    
</bean>
    
    
<bean id="book" class="com.springTest.Book">
         
<property name="id">
            
<value>1000</value>
        
</property>
        
<property name="bookName">
            
<value>战争与和q?/span></value>
        
</property>
    
</bean>
</beans>

    最后的ȝ序:
    public static void main(String[] args) 
    {
        Resource res 
= new ClassPathResource("bean.xml");
        BeanFactory factory 
= new XmlBeanFactory(res);

        Student stu 
= (Student) factory.getBean("student");
        System.
out.println(stu.GetBookName());
    }
    q行后可以看到控制台输出Q-“战争与和q?#8221;?br />
    与Spring.net的用基本完全一_包括配置文g、BeanFactory的获取等Q,所以熟悉Spring.net的你q渡到Spring是非常^滑的?br />     最后,Java中的属性实在是没有C#中的z,呵呵?br />

? 2008-01-11 09:33 发表评论
]]>
Java Q- 在Eclipse上用XFire开发WebService http://m.tkk7.com/human2008/archive/2008/01/11/174493.html??Fri, 11 Jan 2008 01:31:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/11/174493.htmlhttp://m.tkk7.com/human2008/comments/174493.htmlhttp://m.tkk7.com/human2008/archive/2008/01/11/174493.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174493.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174493.html
    采用的工PEclipse3.1.2 + Tomcat5.5 + XFire1.1 。用XFire开发WebService应该说非常的ҎQ只需要按照下面例子的步骤来做Q?br />
Q?Q在Eclipse中新Z个dynamic Web Project Q假讑֐为XFireZhuweiTest?br />
Q?Q导入XFire用户库。该库中应包含xfire-1.1目录下的xfire-all-1.1.jar文gQ以?strong>xfire-1.1\lib
目录下的所有文件?br />
Q?Q将上述的XFire用户库中的所有文件拷贝到XFireZhuweiTest目?strong>WebContent\WEB-INF\lib
目录下?br />
Q?Q修?strong>WebContent\WEB-INF\web.xml
配置文g的内容,下面是修改后web.xmlQ?br />
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    XFireZhuweiTest</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    
    <servlet>
         <servlet-name>XFireServlet</servlet-name>
         <servlet-class>
                 org.codehaus.xfire.transport.http.XFireConfigurableServlet
         </servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
         <url-pattern>/servlet/XFireServlet/*</url-pattern>
     </servlet-mapping>
 
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
          <url-pattern>/services/*</url-pattern>
     </servlet-mapping>
    
</web-app>

    web.xml中添加的servlet映射表明Q所有匹?#8220;/services/*”的urlh全部交给org.codehaus.xfire.transport.http.XFireConfigurableServlet来处理?br />
Q?Q编写需要发布ؓWebService的Javac,q个例子中是一个非常简单的MathService.java?/p>

package com.zhuweisky.xfireDemo;
public class MathService 
{
    
public int Add(int a ,int b)
    {
        
return a+b ;
    }
}

Q?Q在WebContent\META-INF目录下新?strong>xfire文g?/strong>Q然后在xfire目录下添加一个XFire使用的配|文件services.xmlQ该配置文g中的内容反映了要哪些javacd布ؓweb服务。本例中的services.xml内容如下Q?br />

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    
<service>
      
<name>MathService</name>
      
<namespace>http://com.zhuweisky.xfireDemo/MathService</namespace>
      <serviceClass>com.zhuweisky.xfireDemo.MathService</serviceClass>
    
</service>
</beans>

    XFire会借助Spring来解析services.xmlQ从中提取需要发布ؓWebService的配|信息?br />
    很多文章介绍到这里就完了Q然而当我按照他们所说的启动WebService Q然后通过http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 来访问服务描q时Q却抛出了异常,说services.xml文g不存在-Q?br /> “org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist”?nbsp; 

Q?Q非常关键的一点,是q个难题花费了我将q一天的旉?br />     ?strong>WebContent\WEB-INF目录下新?strong>classes文g夹,然后需要将WebContent下的整个META-INF文g夹剪切到新徏的classes文g夹下?br />     到这里,目的完整目录结构如下:



Q?Q在Package Explorer中选中XFireZhuweiTest目Q右?>Run As ->Run On ServerQ关联到你机器上的TomCatQ然后会启动TomcatQ以启动web服务。(注意Q在q行此步骤之前,请先停止TomCatQ?nbsp;

Q?Q在IE中输?http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 会得到正的web服务描述文档?/p>

Q?0Q测试刚发布的webService。我使用C#动态调用Web服务Q?/p>

                //C#
                string url = "http://localhost:8080/XFireZhuweiTest/services/MathService" ;
                
object[] args ={1,2} ;
                
object result = ESFramework.WebService.WebServiceHelper.InvokeWebService(url ,"Add" ,args) ;
                MessageBox.Show(result.ToString());

    Q关于C#动态调用Web服务Q请参见q里Q?br />
    执行后,弹出对话框,昄l果??



? 2008-01-11 09:31 发表评论
]]>
通用分页存储q程(原创)http://m.tkk7.com/human2008/archive/2008/01/10/174353.html??Thu, 10 Jan 2008 09:08:00 GMThttp://m.tkk7.com/human2008/archive/2008/01/10/174353.htmlhttp://m.tkk7.com/human2008/comments/174353.htmlhttp://m.tkk7.com/human2008/archive/2008/01/10/174353.html#Feedback0http://m.tkk7.com/human2008/comments/commentRss/174353.htmlhttp://m.tkk7.com/human2008/services/trackbacks/174353.html1.分页存储q程

CREATE   procedure pagination

 @str_sql           varchar(1000) = '*',     -- 执行的SQL 不含Order by 内容  
 @str_orderfield    varchar(255)='''',       -- 排序的字D名 
 @page_size         int = 10,                     -- 大?nbsp;
 @page_index        int = 0,                      -- 늠
 @order_type        int,                           -- 讄排序cd, ?-1 值则降序 
 @total_count       int   output                 -- q回记录L, ?0 值则q回 
as

---------------------
-- 获取指定늚数据--
---------------------

declare @strsql   varchar(5000)              -- 主语?br /> declare @strtmp   varchar(5000)             -- 临时变量
declare @strorder varchar(400)              -- 排序字串
declare @cruRow   int                            -- 当前行号
 

--执行Ll计
exec getRowCount @str_sql,@total_count output

set @strtmp =  ' select * from ' +
        '      (select top ' + convert(varchar(10),@page_size) + ' * from ' +
        '         (select top ' + convert(varchar(10),(@page_index + 1) * @page_size)  +' * from '+        -- N+1?br />         '            ('+ @str_sql +') Src '

--排序方向
if @order_type !=0
 begin
 set @strsql= @strtmp +
       '          order by @str_orderfield asc) a ' +
       '       order by @str_orderfield desc)b' +
              ' order by @str_orderfield asc'
 end
else
 begin
 set @strsql= @strtmp +
       '          order by @str_orderfield desc) a ' +
       '       order by  @str_orderfieldasc)b' +
              ' order by  @str_orderfield desc'
 end

exec (@strsql)

GO

----------------------------------------------------------------------------

2.分页存储q程执行中用到的行数l计

create  procedure getRowCount
       @sql    nvarchar(2000),
       @count  int output
as
begin

--------------------
-- 获取数据总行?--
--------------------

  declare @tmpsql nvarchar(2000)
  set @tmpsql='select @count=count(*)  from ('+ @sql +') a'

  execute sp_executesql @tmpsql,N'@count int output',@count output
 
end

GO



? 2008-01-10 17:08 发表评论
]]>
վ֩ģ壺 ˳վ| ɫۺ㽶| Ƶ| ŷպۺϾþþ| ޾Ʒþò| þþþþӰԺþþþѾƷС˵ | ҹƵ| èwww˳վ| 2017| ƷƵ| 97Ƶ| ҹav2019| Ļ| ŮˬˬˬˬˬƵ| Ůžž| þۺɫHEZYO| avƬѿ| һëƬѹۿ| avһ߲| ޹һ| ֻˬһëƬѹۿ| ĻĻmv| Avۺ辫Ʒ| ֻĻ| ɫþþþۺ| ¼Ƶѿ| վѴȫպ| av| 91޾Ʒ߹ۿ| ۺAVһҳ| ŮaܴƬ| 黨ýmvѹۿ | ɫAAVѲ| AV뾫ƷëƬ| ޳AVƬþ| ľþþƷww16| aëƬվ| պѲ| Ʒþһ | ëƬAëƬѲ| պĻһҳ |