顯示具有 整理 標籤的文章。 顯示所有文章
顯示具有 整理 標籤的文章。 顯示所有文章

[CentOS]JBoss5.1安裝

序言

此篇簡單的記錄JBoss在CentOS的安裝步驟。

環境

安裝步驟

  1. 到官方網站下載JBoss的5.1.0版的zip檔如[jboss-5.1.0.GA.zip]
  2. 到[/usr/local/]目錄下解壓縮這個zip檔
    #cd /usr/local/
    #unzip jboss-5.1.0.GA.zip
  3. 建立環境變數[JBOSS_HOME],在這邊有兩種方式選一種來就可以了
    • 修改[/etc/profile],可以用如[vi /etc/profile]命令修改,增加已下內容在最後一行:
      export JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      export PATH=$PATH:$JBOSS_HOME/bin
    • 建立一個[jboss.sh]在[/etc/profile.d]目錄,如[vi /etc/profile.d/jboss.sh],內容如下:
      JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      PATH=$PATH:$JBOSS_HOME/bin
      export JBOSS_HOME PATH
  4. 登出再登入OS
  5. 執行JBoss看看有沒有辦法啟動,測試網址為http://localhost:8080/
    #sh $JBOSS_HOME/bin/run.sh -b 0.0.0.0
    • 如果看到以下錯誤訊息而無法啟動,試著修改[/usr/local/jboss-5.1.0.GA/bin/run.conf]這個檔案中的 java [-Xmx]與[-XX:MaxPermSize]這兩個參數的大小
      Error occurred during initialization of VM
      Could not reserve enough space for object heap
      Could not create the Java virtual machine.
  6. 如果要將JBoss已背景方式執行,並在OS啟動時自動啟動,可參考 http://community.jboss.org/wiki/startjbossonbootwithlinux或 http://amjet.dyndns.biz/blog/IT/?p=297
    • 增加jboss帳號與修改目錄權限
      #useradd jboss
      #cd /usr/local/jboss-5.1.0.GA
      #chmod -R 700 ./
    • 修改[/usr/local/jboss-5.1.0.GA/bin/run.conf]檔,將以下內容加在最後一行
      JAVA_HOME=/usr/java/latest
      JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      JBOSS_HOST=0.0.0.0
      JAVAPTH=/usr/java/latest
    • 修改[/usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh]檔,將以下內容加在第一行
      . /usr/local/jboss-5.1.0.GA/bin/run.conf
    • 修改[/etc/rc.local]檔,將以下內容加在最後一行
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh start
    • 如果你想開啟/關閉JBoss就執行以下命令
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh start
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh stop

[CentOS]JDK(Java)安裝

序言

此篇簡單的記錄JDK在CentOS的安裝步驟,下一篇將會搭配這個Java環境安裝JBoss。

環境

安裝步驟

  1. 到官方網站下載JDK的Linux版的RPM檔如[jdk-6u20-linux-i586-rpm.bin]
  2. 執行安裝命令[sh jdk-6u20-linux-i586-rpm.bin],此時會要求你同意授權條件。安裝完成後預設的安裝路徑會帶版號,如[/usr/java/jdk1.6.0_20]。建立一個jdk的目錄連結。
    #sh jdk-6u20-linux-i586-rpm.bin
    #cd /usr/local
    #ln –s /usr/java/jdk1.6.0_20 jdk
  3. 將此JVM加入系統可用Java
    #alternatives --install /usr/bin/java java /usr/java/latest 99
  4. 修改系統預設Java,執行此命令會要你選擇可用的Java編號
    #alternatives --config java
  5. 輸入已下命令確認是否有出現JAVA版本
    #java –version
  6. 建立環境變數[JAVA_HOME],在這邊有兩種方式選一種來就可以了
    • 修改[/etc/profile],可以用如[vi /etc/profile]命令修改,內容如下:
      export JAVA_HOME=/usr/java/latest
      export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin
    • 建立一個[java.sh]在[/etc/profile.d]目錄,如[vi /etc/profile.d/java.sh],內容如下:
      JAVA_HOME=/usr/java/latest
      CLASSPATH=.:$JAVA_HOME/lib.tools.jar
      PATH=$JAVA_HOME/bin:$PATH
      export JAVA_HOME CLASSPATH PATH
  7. 登出再登入OS
  8. 輸入已下命令確認是否有出現環境變數值
    #echo $JAVA_HOME

[CentOS]MySQL安裝

序言

我依據我自己的環境記錄下我的安裝步驟以供自己參考。

環境

安裝步驟

  1. 到官方網站下載MySQL的Linux版的TAR檔如[mysql-5.1.45-linux-i686-glibc23.tar.gz]
  2. 依據官方安裝步驟如下,執行最後一步會啟動MySQL
    #groupadd mysql
    #useradd -g mysql mysql
    #cd /usr/local
    #gunzip < /path/to/mysql-5.1.45-linux-i686-glibc23.tar.gz | tar xvf -
    #ln -s /usr/local/mysql-5.1.45-linux-i686-glibc23 mysql
    #cd mysql
    #chown -R mysql .
    #chgrp -R mysql .
    #scripts/mysql_install_db --user=mysql
    #chown -R root .
    #chown -R mysql data
    #bin/mysqld_safe --user=mysql &
  3. 如果有其他非本機的Client要連現這台DB需建立帳號,如果不綁IP安全性(代表從任何IP都能以該帳號連線)的帳號建立方式如下
    • 進入mysql命令模式
      # /usr/local/mysql/bin/mysql -u root
    • 建立帳號
      mysql>grant all on *.* to 帳號@ identified by '密碼' with grant option;
      mysql>FLUSH PRIVILEGES;
      mysql>quit;
  4. 關閉MySQL
    #/usr/local/mysql/bin/mysqladmin -u root shutdown
  5. 啟動MySQL
    #/usr/local/mysql/bin/mysqld_safe &
  6. 資料庫參數設定檔應該是在/etc/my.cnf,如果沒有可以從/usr/local/mysql-5.1.45-linux-i686-glibc23/support-files底下的*.cnf中挑適合的放在/etc/my.cnf
    • my-innodb-heavy-4G.cnf: 這是一個針對 4G RAM(主要運行只有 InnoDB 表的 MySQL 並使用幾個連接數執行複雜的查詢)。
    • my-huge.cnf: 適合 1GB - 2GB RAM的主機使用。
    • my-large.cnf: 適合 512MB RAM的主機使用。
    • my-medium.cnf: 只有 32MB - 64MB RAM 的主機使用,或者有 128MB RAM 但需要運行其他伺服器,例如 web server。
    • my-small.cnf: 記憶體少於 64MB 時適用這個,MySQL 會佔用較少資源。
  7. 將MySQL設為在OS啟動時自動啟動
    #cp /usr/local/mysql-5.1.45-linux-i686-glibc23/support-files/mysql.server /etc/rc.d/init.d/mysqld
    #chmod 700 /etc/init.d/mysqld
    #chkconfig --add mysqld
    #chkconfig --level 345 mysqld on
    

[分享]PHP版網頁原始碼處理函式

序言

這是我依VB.Net的網頁原始碼處理函式翻過來的PHP版程式,可以取得網頁後,再針對特定標簽進行切割處理。

函式原始碼

我將以下原始碼存在【myClass】目錄的【HTMLParser.php】檔
<?php
Class HTMLParser{
function getHTML($url,$method="GET",$param=NULL,$noCashe=False){
//$param = array("name" => 'tim',"content" => 'test');

if($noCashe){
$cashe="Cache-Control: no-cache\r\n";
}else{
$cashe="";
}
if($method=="GET" and $param!=NULL){
$data="";
foreach ($param as $k => $v) {
if($data!="") $data.="&";
$data.= "$k=".htmlentities($v);
}
$url.="?".$data;
}

if($method=="POST" and $param!=NULL){
$data = http_build_query($param);
$contentLength="Content-length:".strlen($data)."\r\n";
$opts = array(
'http'=>array(
'method'=>$method,
'header'=>"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n"
. "Accept-language: zh-tw\r\n"
. "Content-Typ: application/x-www-form-urlencoded\r\n"
. $cashe . $contentLength,
'content' => $data
)
);
}else{
$opts = array(
'http'=>array(
'method'=>$method,
'header'=>"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n"
. "Accept-language: zh-tw\r\n"
. "Content-Typ: application/x-www-form-urlencoded\r\n"
. $cashe
)
);

}
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
return file_get_contents($url, false, $context);
//return file_get_contents($url);
}
//取得網頁的Body區段
function getHTMLBody($url,$postValue=NULL,$noCashe= False){
$html=NULL;
$htmlBody=NULL;
if($postValue!=NULL){
$html = $this->getHTML($url,"POST",$postValue,$noCashe);
}else{
$html = $this->getHTML($url,"GET", $postValue,$noCashe);
}
If(html!=NULL) $this->getHTMLTagContain($html, "body", $htmlBody);

return $htmlBody;
}
//取得HTML中第一個符合的標籤內容的指標,並將取得的標籤內容寫入參數中
function getHTMLTagContain($html,$tag,&$contain=NULL,&$indexEnd= -1){
$tag = strtolower($tag);
$contain = NULL;
$indexBegin= -1;
$indexEnd = -1;
$indexbBegin= -1;
If($html !=NULL){
$indexBegin = strpos(strtolower($html),"<" . $tag);
if (gettype($indexBegin)!="integer") $indexBegin=-1;
If($indexBegin > -1){
$indexbBegin = strpos($html,">",$indexBegin);
if (gettype($indexbBegin)!="integer"){
$indexbBegin=-1;
}else{
$indexbBegin+=1;
}
$findTag=False;
$indexEnd=$indexbBegin;
$lastStart=$indexbBegin;
$stopLimit2 = 9999;
do{
$indexEnd=strpos(strtolower($html),"</" . $tag,$indexEnd);
if(gettype($indexEnd)!="integer") $indexEnd=-1;
If ($indexEnd > -1){
if(gettype(strpos(substr($html,$lastStart, $indexEnd - $lastStart),"<" . $tag))=="integer"){
$lastStart=$indexEnd;
$indexEnd=$indexEnd+strlen("</" . $tag);
$findTag=True;
}else{
$findTag=False;
}
}else{
$findTag=False;
}
$stopLimit2--;
}while($findTag AND $stopLimit2>0);
If ($indexEnd > -1){
$contain = substr($html,$indexbBegin, $indexEnd - $indexbBegin);

$indexEnd= strpos($html,">",$indexEnd);
if(gettype($indexEnd)!="integer"){
$indexEnd=-1;
}else{
$indexEnd+=1;
}
}
}
}
//echo $contain;
Return $indexbBegin;
}
//取得HTML中第一個符合的標籤屬性的指標,並將取得的標籤內容與該屬性內容寫入參數中
function getHTMLTagAtt($html,$tag,$attName,&$att=NULL,&$contain=NULL,&$indexEnd= -1){
$tag = strtolower($tag);
$attName = strtolower($attName);
$contain = NULL;
$att = NULL;
$indexEnd = -1;
$indexBegin= -1;
$indexaBegin= -1;
$indexbEnd = -1;
If($html !=NULL){
$indexBegin = 0;
$stopLimit1 = 9999;
do{
$indexbEnd = -1;
$indexBegin = strpos(strtolower($html),"<" . $tag,$indexBegin);
if (gettype($indexBegin)!="integer") $indexBegin=-1;
If($indexBegin > -1){
$indexbEnd= strpos($html,">",$indexBegin);
if (gettype($indexbEnd)!="integer") $indexbEnd=-1;
If($indexbEnd > -1){
$indexaBegin = strpos(strtolower(str_replace("\"", "'",substr($html,0, $indexbEnd))),$attName . "='",$indexBegin);
if(gettype($indexaBegin)!="integer") $indexaBegin=-1;
If($indexaBegin > -1){
$sign = substr($html,$indexaBegin + strlen($attName . "="), 1);
$indexaBegin+=strlen($attName . "='");
$indexaEnd= strpos(substr($html,0, $indexbEnd),$sign,$indexaBegin);
if(gettype($indexaEnd)!="integer") $indexaEnd=-1;
If($indexaEnd > -1){
$att = substr($html,$indexaBegin, $indexaEnd - $indexaBegin);
}
}else{
$indexBegin = $indexbEnd + 1;
continue;
}
$indexbEnd+=1;
}

$findTag=False;
$indexEnd=$indexbEnd;
$lastStart=$indexbEnd;
$stopLimit2 = 9999;
do{
$indexEnd=strpos(strtolower($html),"</" . $tag,$indexEnd);
if(gettype($indexEnd)!="integer") $indexEnd=-1;
If ($indexEnd > -1){
if(gettype(strpos(substr($html,$lastStart, $indexEnd - $lastStart),"<" . $tag))=="integer"){
$lastStart=$indexEnd;
$indexEnd=$indexEnd+strlen("</" . $tag);
$findTag=True;
}else{
$findTag=False;
}
}else{
$findTag=False;
}
$stopLimit2--;
}while($findTag==True AND $stopLimit2>0);
If ($indexEnd > -1){
$contain = substr($html,$indexbEnd, $indexEnd - $indexbEnd);
$indexEnd= strpos($html,">",$indexEnd);
if(gettype($indexEnd)!="integer"){
$indexEnd=-1;
}else{
$indexEnd+=1;
}
}
}else{
break;
}
$stopLimit1--;
}while($att == NULL AND $stopLimit1>0);
}
Return $indexbEnd;
}
}
?>

使用範例

<?php
    include 'myClass/HTMLParser.php';
    $htmlParser=new HTMLParser();
    $url = "http://allen080.blogspot.com/2009/05/vbnet20.html";
    //取得整個網頁的HTML
    $htmlAll = $htmlParser->getHTML($url);
    //取得網頁Body的部份
    $htmlBody = $htmlParser->getHTMLBody($url);
    If ($htmlBody!=NULL){
        $indexEnd = strpos($htmlBody,"<span class='item-control blog-admin'>");
        if(gettype($indexEnd)!="integer")    $indexEnd=-1;
        $valueAttribute = NULL;
        $valueContain = NULL;
        If($indexEnd > 0){
            $htmlBody = substr($htmlBody,$indexEnd);
            //取得a標籤1的內容
            $htmlParser->getHTMLTagContain($htmlBody, "span", $valueContain, $indexEnd);
            echo "span標籤的內容: " . $valueContain ."<BR>\n";
            //$htmlBody = substr($htmlBody,$indexEnd);
            //取得a標籤2的內容與href的屬性
            $htmlParser->getHTMLTagAtt($htmlBody, "a", "onclick", $valueAttribute, $valueContain, $indexEnd);
          echo "a標籤的內容與onclick的屬性: " . $valueAttribute ."\t" . ",內容:" . $valueContain;
        }
    }    
?>


執行結果

span標籤的內容:
<a class='quickedit' href='http://www.blogger.com/rearrange?blogID=2698062899592178296&widgetType=HTML&widgetId=HTML1&action=editWidget' onclick='return _WidgetManager._PopupConfig(document.getElementById("HTML1"));' target='configHTML1' title='編輯'>
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>
</a>
<BR>
a標籤的內容與onclick的屬性: return _WidgetManager._PopupConfig(document.getElementById("HTML1"));    ,內容:
<img alt='' height='18' src='http://img1.blogblog.com/img/icon18_wrench_allbkg.png' width='18'/>


總結

這是我為了練習php時寫出的東西~
我個人是覺得滿好用的~
不過有部份邏輯滿複雜的~所以我也不敢保證完全正確或是適用於各種網頁~
如果有人用有發現更好的改進方式請跟我說。


[PHP]字串處理函式

序言

字串處理是常用的功能,大多數語言對這部份也有許多大同小異的函式,以下列出比較常用或我覺得特別需注意的函式。

尋找字串

strpos($string,$find[,$start]):尋找第一個在字串中出現的字詞,傳回0開始的數字位置。【$string】是被找的字串,【$find】是尋找的目標字詞,【$start】是代表尋找的起始位置。→官方文件
這個函式有一個極需注意的部份,就在於它的回傳值,找到的話會回傳位置,也就是個0開始的數字;但沒找到的話就機車了,以VB為例的IndexOf函式是類似這個函式的功能,如果沒找到會回傳【-1】,但在PHP不同版本中,會回傳的值居然是False,那就算了,聽說這是4.0b3版以後的PHP是這樣,更早之前的PHP甚至聽說回傳的連False都不是。於是就有人想出了判斷型態的方法,具體實現方式如下

<?php
    //尋找第一個在字串中出現的字詞
    function str_indexof($string,$find,$start=0){
        $index=strpos($string,$find,$start);
        if(gettype($index)!="integer")    $index=-1;
        return $index;
    }
   
    $string='abcdefghijk';
    $find='l';
    echo str_indexof($string,$find) . "\n";    //-1
    $find='a';
    echo str_indexof($string,$find,3) . "\n";    //-1
    $find='i';
    echo str_indexof($string,$find,3) . "\n";    //8
?>


子字串

substr($string[[,$start],$length]):取得子字串,傳回子字串內容。【$string】是來源字串,【$start】是代表尋找的起始位置,【$length】是子字串長度。→官方文件
這個函式需注意的部份在於它對中文字(UTF-8)會以每個字3字元的方式計算,所以切割時如果是中文字就要以3的倍數遞增。有另外的函式可對含中文的函式做計算找子字串,但如果是用上面談到的strpos函式來找指標,那就可以不用擔心這個問題。具體實現方式如下

<?php
    $string = '這是substr的測試';
    echo substr($string,0,13) . "\n";    //這是substr�
    $string = '這是mb_substr的測試';
    echo mb_substr($string,0,13,'UTF-8') . "\n";    //這是mb_substr的測
?>


字串長度

strlen($string):傳回字串長度。【$string】是來源字串。→官方文件
這個函式與上面一樣對中文字(UTF-8)會以每個字3字元的方式計算。

轉換大小寫

strtoupper($string):回傳轉換為英文大寫字串。strtolower($string):取得轉換為英文小寫字串。【$string】是來源字串。→官方文件
這個函式與上面一樣對中文字(UTF-8)會以每個字3字元的方式計算。

文字切割

split($pattern,$string[,$limit]):將字串依分割條件切割為陣列,回傳結果陣列。【$pattern】是分割條件,可為字串或是正規表達式。【$string】是來源字串。【$limit】最多切出幾個元素。
這個函式較直得注意的有兩點,一個是參數順序,居然不是來源字串...;第二個是分割條件【$pattern】可用正規表達式,有關於正規表達式可參考相關連結。→官方文件

文字驗證

ereg($pattern,$string[,&$arrResult]):依正規表達式驗證字串格式(比對字串時有大小寫之分),回傳True符合或False不符合。→官方文件
eregi($pattern,$string[,&$arrResult]):功能同上,但比對字串時沒有大小寫之分。
【$pattern】是驗證條件正規表達式。【$string】是來源字串。【$arrResult】符合的文字。
這個函式較直得注意的一樣有兩點,一個是參數順序;第二個是驗證條件【$pattern】為正規表達式,如【^[a-z0-9-]{3,8}$】如果要完整比對字串的話,要記得開頭用與結尾分別用【^】與【$】把條件框住,【[a-z0-9-]】代表小寫a~z與0~9及減號都是可用的字元,【{3,8}】代表上數字元可重複的次數為3~8次,可參考相關連結。
相關連結
  • PHP官方開發手冊:英文開發手冊。
  • W3School:簡體中文的網站開發程式語言文件,雖然有些不夠完整,不過很適合當工具書或初學參考(除了PHP,其他還有許多網頁語言)。

[程式]VB.Net2.0資料庫通用存取函式

序言

在VS2005建立VB專案(或Web網站)後,若要進行資料庫存取,我個人比較習慣將連線字串寫在設定檔app.config(或web.config)下。

不過VB專案預設是不會產生這個檔,而且在程式中若要取得連線字串的設定也要對專案的參考進行設定。

以下記錄下我做的設定,並把資料庫存取程式簡化為函式。

開發環境

  • VB.Net 2.0 (VS2005)
  • MSSQL2005 Express

專案設定

  • 建立專案後預設的專案屬性下,參考的元件如下圖:

  • 下面的程式中會用到【ConfigurationManager】這個物件來取得設定檔的連線字串,所以我們需要加入【System.Configuration】這個元件:

    點選加入,在.Net分頁下找到【System.Configuration】這個元件
  • 再來要在專案加入新項目【應用程式組態】,名稱用預設的【app.config】就可以了:

  • 編輯app.config,在【configuration】標籤內加入連線字串的設定如:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    ...
    <connectionStrings>
    <add name="MSSQLDB1"
    connectionString="Data Source=localhost;Initial Catalog=MyTestDB;Integrated Security=True"
    providerName="System.Data.SqlClient" />
    <add name="MSSQLDB2"
    connectionString="Data Source=127.0.0.1;Initial Catalog=MyTestDB;User ID=sa;Password=1234"
    providerName="System.Data.SqlClient" />
    </connectionStrings>
    ...

通用存取函式類別


Imports System.Data.SqlClient
Imports System.Configuration
Public Class DBAccessFunc
    ''' <summary>
    ''' 從ConfigurationManager中的ConnectionStrings找出Initial Catalog
    ''' </summary>
    ''' <param name="ConnName">ConnectionStrings名稱(String)</param>
    ''' <returns>回傳資料庫名稱</returns>
    ''' <remarks>從ConfigurationManager中的ConnectionStrings找出Initial Catalog</remarks>
    Public Shared Function getDBName(ByVal ConnName As String) As String
        Dim val As String = ""
        Dim ConnString As String = ConfigurationManager.ConnectionStrings(ConnName).ConnectionString
        Dim i As Integer = ConnString.IndexOf("Initial Catalog=")
        If i > -1 Then
            val = ConnString.Substring(i + "Initial Catalog=".Length)
            i = val.IndexOf(";")
            If i > -1 Then
                val = val.Substring(0, i)
            End If
        End If
        Return val
    End Function

    Public Shared Function getConnString(ByVal ConnName As String) As String
        Return ConfigurationManager.ConnectionStrings(ConnName).ConnectionString
    End Function


    Public Shared Function getConn(ByVal ConnName As String) As SqlConnection
        Return New SqlConnection(getConnString(ConnName))
    End Function
    ''' <summary>
    ''' 查詢資料庫
    ''' </summary>
    ''' <param name="cn">連線</param>
    ''' <param name="sql">查詢內容</param>
    ''' <returns>回傳查詢結果的DataTable</returns>
    ''' <remarks>查詢資料庫並回傳查詢結果的DataTable</remarks>
    Public Shared Function getTable(ByRef cn As SqlConnection, ByRef sql As String, Optional ByVal isColseConn As Boolean = True) As Data.DataTable
        Dim da As New SqlDataAdapter(sql, cn)
        Dim dt As New Data.DataTable("dt_xml")
        Try
            If cn.State = ConnectionState.Closed Then cn.Open()
            da.SelectCommand.CommandTimeout = 36000000
            da.Fill(dt)
        Catch ex As Exception
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
            Throw ex
        End Try
        If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
        Return dt
    End Function

    ''' <summary>
    ''' 執行命令
    ''' </summary>
    ''' <param name="cn">連線</param>
    ''' <param name="sql">查詢內容</param>
    ''' <returns>回傳受影響的資料筆數</returns>
    ''' <remarks>執行命令並回傳受影響的資料筆數</remarks>
    Public Shared Function doCmd(ByRef cn As SqlConnection, ByRef sql As String, Optional ByRef param() As SqlParameter = Nothing, Optional ByVal isColseConn As Boolean = True) As Integer
        Dim result As Integer = 0
        Dim cmd As New SqlCommand
        Try
            cmd.Connection = cn
            cmd.CommandText = sql
            If Not param Is Nothing Then
                cmd.Parameters.AddRange(param)
            End If
            cmd.CommandTimeout = 36000000
            If cn.State = ConnectionState.Closed Then cn.Open()
            result = cmd.ExecuteNonQuery()
        Catch ex As Exception
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
            Throw ex
        Finally
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
        End Try
        Return result
    End Function


    ''' <summary>
    ''' 取得單一資料
    ''' </summary>
    ''' <param name="cn">連線</param>
    ''' <param name="sql">查詢內容</param>
    ''' <returns>回傳受影響的資料筆數</returns>
    ''' <remarks>執行命令並回傳受影響的資料筆數</remarks>
    Public Shared Function doScalar(ByRef cn As SqlConnection, ByRef sql As String, Optional ByRef param() As SqlParameter = Nothing, Optional ByVal isColseConn As Boolean = True) As Object
        Dim result As Object = Nothing
        Dim cmd As New SqlCommand
        Try
            cmd.Connection = cn
            cmd.CommandText = sql
            If Not param Is Nothing Then
                cmd.Parameters.AddRange(param)
            End If
            cmd.CommandTimeout = 36000000
            If cn.State = ConnectionState.Closed Then cn.Open()
            result = cmd.ExecuteScalar()
        Catch ex As Exception
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
            Throw ex
        Finally
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
        End Try
        Return result
    End Function

    Public Function executeStoredProcedure(ByRef cn As SqlConnection, ByVal procedure As String, Optional ByRef param As SqlParameter() = Nothing, Optional ByRef output As SqlParameter() = Nothing, Optional ByVal isColseConn As Boolean = True) As Integer
        Dim result As Integer = 0
        Dim cmd As New SqlCommand(procedure, cn)
        Try

            cmd.CommandText = procedure
            cmd.CommandTimeout = 36000000
            cmd.CommandType = CommandType.StoredProcedure
            If Not param Is Nothing Then cmd.Parameters.AddRange(param)
            If Not output Is Nothing Then
                For Each o As SqlParameter In output
                    o.Direction = ParameterDirection.Output
                Next
                cmd.Parameters.AddRange(output)
            End If

            '開啟資料庫連線
            If cn.State = ConnectionState.Closed Then cn.Open()
            '設定變數儲存受影響資料列
            result = cmd.ExecuteNonQuery()
        Catch ex As Exception
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
            Throw ex
        Finally
            cmd.Parameters.Clear()
            If isColseConn And cn.State = ConnectionState.Open Then cn.Close()
        End Try
        Return result
    End Function
End Class


使用範例程式

Dim connStr1 As String = DBGenFunc.getConnStr("MSSQLDB1")
Dim sourceTable As String() = {"[" & DBGenFunc.getDBName("MSSQLDB1") & "].[dbo].[" & "MyTestTab" & "]", _
"[" & DBGenFunc.getDBName("MSSQLDB1") & "].[dbo].[" & "MyContentTab" & "]"}
Dim param() As SqlClient.SqlParameter = {New SqlClient.SqlParameter("P0", SqlDbType.VarChar)}
Dim sql As String

Dim title As String

Console.WriteLine("doCmdScalar Start:")
sql = "SELECT Title" & vbCrLf & _
" FROM " & sourceTable(0) & "" & vbCrLf & _
" WHERE SN=@P0"
param(0).Value = 1
title = DBGenFunc.doCmdScalar(connStr1, sql, param)
Console.WriteLine("doCmdScalar" & vbTab & title)

Console.WriteLine("getTable Start:")
sql = "SELECT Title" & vbCrLf & _
" FROM " & sourceTable(0) & "" & vbCrLf
Dim dt As DataTable = DBGenFunc.getTable(connStr1, sql)
For Each r As DataRow In dt.Rows
title = r.Item(0)
Console.WriteLine("getTable" & vbTab & title)
Next

Console.WriteLine("getTableToArray Start:")
Dim data As String() = DBGenFunc.dataTableToArray(Of String)(dt, 0)
For Each r As String In data
title = r
Console.WriteLine("getTable" & vbTab & title)
Next

Console.WriteLine("doCmd Start:")
sql = "INSERT INTO " & sourceTable(0) & "" & vbCrLf & _
"VALUES(@P0,@P1)"
param = New SqlClient.SqlParameter() {New SqlClient.SqlParameter("P0", SqlDbType.VarChar), _
New SqlClient.SqlParameter("P1", SqlDbType.VarChar)}
param(0).Value = "TNew"
param(1).Value = "SNew"
title = DBGenFunc.doCmd(connStr1, sql, param)
Console.WriteLine("doCmd" & vbTab & title)

Console.WriteLine("getReader Start:")
sql = "SELECT Title, Subject" & vbCrLf & _
" FROM " & sourceTable(0) & "" & vbCrLf
Dim dr As SqlClient.SqlDataReader = DBGenFunc.getReader(connStr1, sql)
While dr.Read()
title = dr.Item(0)
Console.WriteLine("getReader" & vbTab & title & vbTab & dr.Item(1))
End While
DBGenFunc.closeReader()

執行結果

doCmdScalar Start:
doCmdScalar T1
getTable Start:
getTable T1
getTable T2
getTable T3
getTable TNew
getTableToArray Start:
getTable T1
getTable T2
getTable T3
getTable TNew
doCmd Start:
doCmd 1
getReader Start:
getReader T1 S1
getReader T2 S2
getReader T3 S3
getReader TNew SNew
getReader TNew SNew

[筆記]我的FireFox愛用套件

序言

此篇記下我常用的套件相關連結,方便安裝使用。

清單

  1. FireFox主程式(我都用Portable版不用安裝):
    FireFox Portable by portableapps.com
  2. Foxmarks:官網。書籤同步,可至官網直接登入瀏覽你的書籤。
  3. FireGestures:滑鼠手式(控制上一頁下一頁等)。
  4. QuickDrag:用拖曳手勢更容易地在新分頁裡打開連結、搜尋文字和儲存圖片。
  5. 新同文堂:官網。中文繁簡體互轉工具。
  6. Tab Mix Plus:官網。分頁加強版。
  7. Mozilla Archive Format:MHT (MHTML) 檔案開啟外掛。
  8. Copy Links:方便複製連結。
  9. FacePad:Facebook相簿下載(安裝後於相簿連結點右鍵可以看到功能)。
  10. Greasemonkey:官網。客製化網頁Script功能。搭配以下Script。
  11. FlashGot:官網。搭配其他下載工具用。
  12. PCmanfx:官網。上BBS。
  13. Profile Manager and Synchronizer :多帳號登入。

[整理]微軟與Google網頁小工具開發資料

序

我自己是有參加過微軟的小工具開發教學,所以對這部份比較了解~

但Google的小工具教學那天我剛好沒參加到~但我朋友有~

所以我只知道一些教學資源的連結~還沒有空去摸索~

Live與Spaces網頁小工具開發

連結參考自小工具設計比賽

  • 小工具庫
  • 小工具範例
  • Visual Web Developer Express Edition
  • VWD Express的Gadget專案範本 :直接放在【我的文件\Visual Studio 2005\Templates\ProjectTemplates\】
  • 嘗試執行Gadget【http://gadgets.start.com/gadget.aspx?manifestUrl=http://localhost/(你的Manifest XML)】
  • 將Gadget新增到Space (開發人員模式)【http://spaces.live.com/api.aspx?wx_action=addGadget&wxp_url=(你的Manifest XML)】

部落格小工具開發手冊

教育訓練教學課程

製作 Gadget 可能用的到更多參考資料

語言上的參考資料

Google網頁小工具與Map應用開發

連結參考自Google Taiwan Developers Day 2007

這裡是關於技術的手札~

也歡迎大家到

倫與貓的足跡

或

到噗浪來

關心一下我唷!
by 倫
 
Copyright 2009 倫倫3號Beta-Log All rights reserved.
Blogger Templates created by Deluxe Templates
Wordpress Theme by EZwpthemes