2010年12月19日 星期日

ObjectDumper

//Copyright (C) Microsoft Corporation. All rights reserved.

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;


public class ObjectDumper {

public static void Write(object element)
{
Write(element,
0);
}

public static void Write(object element, int depth)
{
Write(element, depth, Console.Out);
}

public static void Write(object element, int depth, TextWriter log)
{
ObjectDumper dumper
= new ObjectDumper(depth);
dumper.writer
= log;
dumper.WriteObject(
null, element);
}

TextWriter writer;
int pos;
int level;
int depth;

private ObjectDumper(int depth)
{
this.depth = depth;
}

private void Write(string s)
{
if (s != null) {
writer.Write(s);
pos
+= s.Length;
}
}

private void WriteIndent()
{
for (int i = 0; i < level; i++) writer.Write(" ");
}

private void WriteLine()
{
writer.WriteLine();
pos
= 0;
}

private void WriteTab()
{
Write(
" ");
while (pos % 8 != 0) Write(" ");
}

private void WriteObject(string prefix, object element)
{
if (element == null || element is ValueType || element is string) {
WriteIndent();
Write(prefix);
WriteValue(element);
WriteLine();
}
else {
IEnumerable enumerableElement
= element as IEnumerable;
if (enumerableElement != null) {
foreach (object item in enumerableElement) {
if (item is IEnumerable && !(item is string)) {
WriteIndent();
Write(prefix);
Write(
"...");
WriteLine();
if (level < depth) {
level
++;
WriteObject(prefix, item);
level
--;
}
}
else {
WriteObject(prefix, item);
}
}
}
else {
MemberInfo[] members
= element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance);
WriteIndent();
Write(prefix);
bool propWritten = false;
foreach (MemberInfo m in members) {
FieldInfo f
= m as FieldInfo;
PropertyInfo p
= m as PropertyInfo;
if (f != null || p != null) {
if (propWritten) {
WriteTab();
}
else {
propWritten
= true;
}
Write(m.Name);
Write(
"=");
Type t
= f != null ? f.FieldType : p.PropertyType;
if (t.IsValueType || t == typeof(string)) {
WriteValue(f
!= null ? f.GetValue(element) : p.GetValue(element, null));
}
else {
if (typeof(IEnumerable).IsAssignableFrom(t)) {
Write(
"...");
}
else {
Write(
"{ }");
}
}
}
}
if (propWritten) WriteLine();
if (level < depth) {
foreach (MemberInfo m in members) {
FieldInfo f
= m as FieldInfo;
PropertyInfo p
= m as PropertyInfo;
if (f != null || p != null) {
Type t
= f != null ? f.FieldType : p.PropertyType;
if (!(t.IsValueType || t == typeof(string))) {
object value = f != null ? f.GetValue(element) : p.GetValue(element, null);
if (value != null) {
level
++;
WriteObject(m.Name
+ ": ", value);
level
--;
}
}
}
}
}
}
}
}

private void WriteValue(object o)
{
if (o == null) {
Write(
"null");
}
else if (o is DateTime) {
Write(((DateTime)o).ToShortDateString());
}
else if (o is ValueType || o is string) {
Write(o.ToString());
}
else if (o is IEnumerable) {
Write(
"...");
}
else {
Write(
"{ }");
}
}
}

2010年12月10日 星期五

2010年12月3日 星期五

安裝 SQL Server時發生 效能計數器登錄區一致性 的錯誤

我發現再重安裝SQL Server 2008 系統
或是安裝英文版的 SQL Server 2008 時
都會遇到 效能計數器登錄區一致性 的錯誤

微軟的官方解法是利用翻譯機翻的結果
不是很容易懂

http://demo.tc/Post/450
圖文併茂的說明
將 Perflib 下的 004/009 的 LastCounter, LastHelp 的最大值
更新到 Perflib 中的 LastCounter, LastHelp
就可順利解決, 推薦!

2010年12月1日 星期三

DB to XML, then XML to DB

1. 第一段 Script 的重點在於寫資料到XML 告知 .NET 需要寫入資料外也一併將 Schema 寫進到 XML 中
2. 第二段 Script 的重點在於利用 XSD 功能將對應的 INSERT 敘述產生出來
3. 第二段 Script 的另一個重點是利用 Merge 將 Memory 中的 DataSet 資料灌進到 XSD 的 DataTable
3. 第二段 Script 的最後一個重點是利用 Adapter.Update 將 XSD 的 DataTable 資料呼叫對應的 InsertCommand (利用 XSD產生)
寫入資料庫

        protected void ReadDataBaseAndWriteToXML()
        {           
            using (SqlConnection conn = form.DataBaseManager.getConnection())
            {
           
                SqlCommand command = conn.CreateCommand();
                command.CommandText = "select * from ow_param";
                SqlDataAdapter adapter = new SqlDataAdapter("select * from ow_param", conn);
                DataSet dataset = new DataSet();

                adapter.Fill(dataset);
                // dataset.WriteXml(@"c:\ow_param.xml"), only output the string format data
                dataset.WriteXml(@"c:\ow_param_w_schema.xml", XmlWriteMode.WriteSchema);
               
            }
           
           
        }

        protected void LoadXMLSchemaAndSaveToDB()
        {

            DataSet dataset = new DataSet();           
            dataset.ReadXml(@"c:\ow_param_w_schema.xml");
            string tableName = dataset.Tables[0].TableName;           

            using (basic.xsd.oym_ow_paramTableAdapters.OW_PARAMTableAdapter ow_paramAdapter = new ICE.basic.xsd.oym_ow_paramTableAdapters.OW_PARAMTableAdapter())
            {

                DataTable xmlTable = dataset.Tables[tableName];
                basic.xsd.oym_ow_param.OW_PARAMDataTable dbTable =  ow_paramAdapter.GetData();
                dbTable.Merge(xmlTable);
                if (dbTable != null)
                {
                    ow_paramAdapter.Update(dbTable);
                }
            }

        }

2010年11月25日 星期四

FindBugs in Java

建議可以安裝FindBugs,
可以幫助我們找到一些意想不到的臭蟲與安全漏洞!

FindBugs™ - Find Bugs in Java Programs
http://findbugs.sourceforge.net/

FindBugs downloads
http://findbugs.sourceforge.net/downloads.html

[工具介紹] Java程式檢測工具 (二) - FindBugs
http://cyrilwang.blogspot.com/2009/09/java-findbugs.html

Code Analysis Tools
http://java.ociweb.com/javasig/knowledgebase/2010-04/index.html

2010年11月18日 星期四

Microsoft Office 不是正版

怪怪,明明就是正版,
不知道序號是被那個好事之人拿去用..

每一啟動 Office 軟體就會出現警告訊息

只能請他先閉嘴

執行下面移除 Office Genuine Advantage (OGA) 的程序。

msiexec.exe /uninstall {B2544A03-10D0-4E5E-BA69-0362FFC20D18}

總算不會再哈拉了..

2010年11月17日 星期三

SVN integrated with Apache

SVN Server 本身可與 Apache 結合在一起
主要是利用 兩個 mod
分別是
mod_dav_svn.so
mod_authz_svn.so

SVN 安裝好就不要動他
使用者透過 http 訪問時
會跟 Apache 要登錄帳號及存取 svn
這時透過 httpd.conf 設定

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

而 httpd.conf 要存取的 svn 的範例


DAV svn
SVNPath E:\SVN\Product\express
AuthType Basic
AuthName OmniWiseInside
AuthUserFile E:\SVN\passwdInside
Require user Jason
Require user Jimmy
Require user Joy
Require user June


有時會遇到 Apache 啟動不起來
Cannot load /etc/httpd/modules/mod_dav_svn.so into server
主要原因有二
1. mod_dav_svn.so 及 mod_authz_svn.so 不存在於 Apache modules 中
2.
mod_dav_svn.so 及 mod_authz_svn.so  所需要的 .dll 不存在於 Apache bin
第一個可以在 SVN 中找一下這幾個檔案並複製到 modules
第二個問題可以在 SVN 中 bin 的 .dll copy 到 Apache bin 中 (若存在不要蓋過去,不夠的再 copy 過去)


2010年11月14日 星期日

asp:Button 搭配 UseSubmitBehavior 屬性 行為觀察

1. asp:Button 搭配 UseSubmitBehavior 屬性 行為觀察
   UseSubmitBehavior="false" 配上 OnClientClick="return onClientClick()"

   表面上就是讓 Asp:Button 不會執行 Postback (不論回傳的 script 是 true/ false, 只會乖乖的執行 script 內容)

   實際上事後端的產生的 Script 檔下來 Postback 後面的內容
   ASP.NET 會產生 return onClientClick();__doPostBack('Button1','') 的 Runtime script
   由於 return 命令在 __doPostBack('Button1','') 之前
   因此 __doPostBack('Button1','') 不會被執行
   執行起來就像是一般的 Button <input type="button">
  
   UseSubmitBehavior="true"
   會執行 Javascript 但是只有 script 回傳結果為 true 時, 系統才會執行 Server 端的 script
   如同一般 <input type="submit">
  
   asp:ImageButton 與 asp:Button UseSubmitBehavior="true" 是一樣的結果
  
        protected void Button1_Click(object sender, EventArgs e)
        {  Response.Write("CLICK1");   }

        protected void Button2_Click(object sender, EventArgs e)
        {  Response.Write("CLICK2");   }

        function onClientClick() {
           if (confirm('Run Server Script'))
           {
               alert("YES");
              return true;
           }  else {
              alert("NO");
              return false;
           }
        }

        <asp:Button ID="Button1" runat="server" CommandArgument="1" onclick="Button1_Click" Text="Button1" UseSubmitBehavior="false"  OnClientClick="return onClientClick()"/>
        <asp:Button ID="Button2" runat="server" CommandArgument="2" onclick="Button2_Click" Text="Button2" OnClientClick="return onClientClick()"/>
                <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="Query.jpg"  OnClientClick="return onClientClick()" onclick="ImageButton1_Click" style="height: 16px" />

2. Runtime result

    <input type="button" name="Button1" value="Button1" onclick="return onClientClick();__doPostBack('Button1','')" id="Button1" />
    <input type="submit" name="Button2" value="Button2" onclick="return onClientClick();" id="Button2" />
        <input type="image" name="ImageButton1" id="ImageButton1" src="Query.jpg" onclick="return onClientClick();" style="border-width:0px;height: 16px" />

3. 容易出錯的地方

   OnClientClick="return onClientClick()"
   寫成
  
   OnClientClick="onClientClick"
   Script engine 找不到一個叫做 onClientClick 的 function,
   因此這段 Button1, Button2, ImageButton1 直接 Postback  給 Server  
  
   或是
   OnClientClick="onClientClick()"
   Script engine 會找到一個 onClientClick() 的 function 並執行這段 script
   接著再執行 __doPostBack('Button1','') (若是 UseSubmitBehavior="true")
   但是不管 onClientClick() 的結果
   Button1, Button2, ImageButton1 最後還是會 Postback  給 Server
  
4. 結論
   Button/ ImageButton 務必以 return onClientClick(); 方式呼叫
   若程式不需要被 postback, onClienClick()
   最後傳回 return false;
   告知系統不需要 postback
  
     

2010年11月13日 星期六

Telerik RadGrid Page Navigator 中文化

這是我設計的 Telerik RadGrid Page Navigation Style  中文化訊息
It's my design for "Telerik RadGrid Page Navigation Style" in Madarin
歡迎使用/ Welcome to use.
Philip Chen

 <PagerStyle NextPageText="下一頁" PrevPageText="上一頁" FirstPageToolTip="第一頁" LastPageToolTip="最末頁"
NextPagesToolTip="下一頁" NextPageToolTip="下一頁" PagerTextFormat="變更頁數: {4} &amp;nbsp;頁數 &lt;strong&gt;{0}&lt;/strong&gt; / &lt;strong&gt;{1}&lt;/strong&gt;, &lt;strong&gt; 共 {5} 筆記錄&lt;/strong&gt;."  PageSizeLabelText="每頁筆數" PrevPagesToolTip="上一頁" PrevPageToolTip="上一頁" />

2010年11月12日 星期五

如何將 RadioGroupItem Item 隱藏

在 .NET 中
RadioGroupItem 物件中的 Item 要從畫面中隱藏
有幾種作法
1. Remove

radioOption.Items.Remove(radioOption.Items.FindByValue("APPROVE"));
這是將 Item 中有一個 Value 為 APPROVE 的項目移去

眼不見為靜
但是缺點在於在 ViewState 過程中他就不會再出現了
破壞容易, 但是需要再把他救回來, 原先的 Attribute/ Checked 等選項還要補上去

2. CSS 策略
   在 CSS 中加入
   .hidden
    {  display:none;  }
   程式中加入 Attribute
   radioOption.Items.FindByValue("APPROVE").Attributes.Add("class", "hidden");
   之後程式需要在顯示
   radioOption.Items.FindByValue("APPROVE").Attributes.Remove("class");

我比較喜歡用後面這招
雖然空間多浪費一點
但是程式控制能力比較好..
  

2010年11月10日 星期三

RadWindow Open Short Script

--- Caller

 <telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"><script type="text/javascript">
    
      
        function rowEdit() {

            var radGridTable = $find("<%=RadGrid2.ClientID%>");
           
            if ( (radGridTable.get_masterTableView().get_dataItems().length) ==0 )
               {
                   alert("請選擇資料項目..");
                   return false;     
            }
     
            selectedItems =   radGridTable.get_masterTableView().get_selectedItems();
           
            if (selectedItems.length > 0) {
               // find Window Manager
               var manager = $find("<%=RadWindowManager1.ClientID%>");
               // find Window
               var window = manager.getWindowByName("RadWindow1");
               // find Grid Master Table
               var masterTable = $find("<%=RadGrid2.ClientID%>").get_masterTableView();

               // get the selected item
               var selectedItem = masterTable.get_selectedItems()[0];
              
               // extract the PK value
               var pk = masterTable.getCellByColumnUniqueName(selectedItem, "seq_no").innerHTML;
               // open the link
              
               window.setUrl("EquipForm.aspx?action=APPROVE&pk=" + pk);
               window.show();

               // avoid postback
               return false;
                 
            }
            else {
                alert("請選擇資料項目..");
                return false;     
            }


        }


        function rowEditSaved() {

            var radGridTable = $find("<%=RadGrid3.ClientID%>");
            if ((radGridTable.get_masterTableView().get_dataItems().length) == 0) {
                alert("請選擇資料項目..");               
                return false;
            }

            selectedItems = radGridTable.get_masterTableView().get_selectedItems();


            if (selectedItems.length > 0) {
               
                // find Window Manager
                var manager = $find("<%=RadWindowManager1.ClientID%>");
                // find Window
                var window = manager.getWindowByName("RadWindow2");
                // find Grid Master Table
                var masterTable = $find("<%=RadGrid3.ClientID%>").get_masterTableView();

                // get the selected item
                var selectedItem = masterTable.get_selectedItems()[0];

                // extract the PK value
                var pk = masterTable.getCellByColumnUniqueName(selectedItem, "seq_no").innerHTML;
                // open the link
               
                window.setUrl("EquipForm.aspx?action=SAVE&pk=" + pk);
                window.show();

                // avoid postback
               
                return false;


            }
            else {
                alert("請選擇資料項目..");
                return false;
            }
           
            return false;

        }

        function masterClientClose(sender, eventArgs) {

            var masterTable = $find("<%= RadGrid1.ClientID %>").get_masterTableView();
            masterTable.rebind();

            masterTable = $find("<%= RadGrid2.ClientID %>").get_masterTableView();
            masterTable.rebind();

        }


        function savedMasterClientClose(sender, eventArgs) {

            var masterTable = $find("<%= RadGrid3.ClientID %>").get_masterTableView();
            masterTable.rebind();

        }
       
        function masterClientShow(sender, eventArgs)
        {
       
          var masterTable = $find("<%= RadGrid2.ClientID %>").get_masterTableView();                       
          sender.argument = masterTable;

        }


        function masterSavedClientShow(sender, eventArgs) {

              var masterTable = $find("<%= RadGrid3.ClientID %>").get_masterTableView();
              sender.argument = masterTable;

        }
      
        function rowDBClick(sender, args) {          
           
            rowEdit();
       
        }

        function rowDBClickSaved(sender, args) {

            return rowEditSaved();

        }
    
       </script></telerik:RadCodeBlock>
      

<telerik:RadWindowManager ID="RadWindowManager1" runat="server" Skin="Outlook">
 
        <Windows>
              <telerik:RadWindow runat="server"  Behavior="Default" ID="RadWindow1"  Width="840px" Height="600px"
                InitialBehavior="None" Left="" Modal="True" NavigateUrl="" OnClientShow="masterClientShow" OnClientClose="masterClientClose"
                 Top="" VisibleStatusbar="false" ReloadOnShow="True" ShowContentDuringLoad="False"></telerik:RadWindow>
                
              <telerik:RadWindow runat="server"  Behavior="Default" ID="RadWindow2"  Width="840px" Height="600px"
                InitialBehavior="None" Left="" Modal="True" NavigateUrl="" OnClientShow="masterSavedClientShow" OnClientClose="savedMasterClientClose"
                 Top="" VisibleStatusbar="false" ReloadOnShow="True" ShowContentDuringLoad="False"></telerik:RadWindow>
                
                
        </Windows>
       
    </telerik:RadWindowManager>      
   
   
   
-- Callee

  <telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">
    <script type="text/javascript">
       
        function GetRadWindow()   {
            var oWindow = null;
            if (window.radWindow)
            oWindow = window.RadWindow; //Will work in Moz in all cases, including clasic dialog
            else if (window.frameElement.radWindow)
            oWindow = window.frameElement.radWindow;//IE (and Moz as well)
            return oWindow;
        }

        function CloseAndExitPopWindow(message) {
            GetRadWindow().Close();
            if (message.length != 0)
              alert(message);
            var masterTable = GetRadWindow().argument;
            masterTable.rebind();
           
        }
     
        function RefreshParentPage()
        {
            var masterTable = GetRadWindow().argument;
            masterTable.rebind();
        }
   
    </script>
    </telerik:RadCodeBlock>
   
    <telerik:RadWindowManager ID="RadWindowManager1" runat="server" Skin="Outlook" >
 
        <Windows>
              <telerik:RadWindow runat="server"  Behavior="Default" ID="RadWindow1"  Width="740px" Height="540px"
                InitialBehavior="None" Left="" Modal="True" NavigateUrl=""
                 Top="" VisibleStatusbar="false" ReloadOnShow="True" ShowContentDuringLoad="False"></telerik:RadWindow>
           
        </Windows>             

    </telerik:RadWindowManager>
       

2010年11月6日 星期六

Stop ImageButton Postback

JS 中配上這個"終結令"

function foo(event)
{
   // 第一行就堵起來
   if (window.event)
       window.event.returnValue = false;   // IE, Chrome
   else
       event.preventDefault();   // FF
   ...
 
}

在 aps.net

<asp:ImageButton runat="server" id="image" OnClientClick="foo(event)">
包准 Button, ImageButton 不會往後端送 Postback
煞車煞的住!

Web Free Button Makers

找到兩家還不錯的 Button Makers 的 Site
最重要是能支援中文 (Unicode)

首推 http://cooltext.com/Logo-Design?LogoID=22&Font=11096
支援中文外,還支援超過 30 幾種中文字體,超強!

其次 http://dabuttonfactory.com/
一般,中文字體只有一種,但是 Button 選項還不少

對了,補充一下
黃金的 RGB 是 211,168, 9 (百度說的)

2010年11月5日 星期五

RadAjaxManager 對 ASP:RadioButtonList 失效的解決方案

手上 Telerik 開發的版本是 2009.03 版本
(應該需要更新了吧! 有機會試看看新版本及 VS 2010是否解決了這個問題)

我需要利用 RadioButtonList 透過 Ajax 驅動 其他元件
但結果是
只有一次能被驅動
之後就不能再啟動對應的呼叫
試了幾次,受不了了

Google 之後
發現官方網站就有人也問這個問題
Telerik 說這是 MS AJAX 的問題
不過我還是需要解決方案, 理由太多是無濟於事滴 ~~

還好,有一篇討論到節決方案
http://www.telerik.com/community/forums/aspnet-ajax/ajax/the-radajaxmanager-do-not-fire-postback-with-radiobuttonlist.aspx

竟然是將 RadioButtonList 自己也加進去驅動對象, 真是個怪解..

2010年9月19日 星期日

Windows 2008遠端桌面連接數設定

Refer to internet link and it says:

Many times, you’ll find it necessary to have multiple connections to a Remote Desktop server, and by default, Windows Server 2008, Windows Server 2003, Window Vista, Windows XP, etc. limit the number of Remote Desktop Connections to 1 user. On Windows Server 2008, the Restrict Terminal Services users to a single remote session Group Policy setting determines whether you can connect to your existing physical console session. When this option is enabled, when logging on by default, you will be restricted to a single remote session.
Run "gpedit.msc."  This setting is available in the Computer Configuration\Administrative Templates\Windows Components\Terminal Services\Terminal Server\Connections node of the Local Group Policy Editor. You can also configure this setting in Terminal Services Configuration. The Restrict each user to a single session setting appears in Edit settings in the General section. Sometimes it is under "Computer Configuration\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Connections\Restrict Rmote Desktop Services users to a single Remote Desktop Services session" to disabled
If you would like to have multiple simultaneous sessions for the same user, please uncheck this setting or set this group policy as Disabled.
For more information regarding Changes to remote administration in Windows Server 2008, please refer to the following KB article:
Changes to remote administration in Windows Server 2008
http://support.microsoft.com/kb/947723
sources:
Setting up multiple sessions by disablign group policy. http://www.techotopia.com/index.php/Configuring_Windows_Server_2008_Remote_Desktop_Administration#Running_Multiple_Remote_Desktops

Setting up multipe sessions using MMC Remote Desktops snap-in. http://i.nconspicuo.us/2008/11/20/enable-multiple-remote-desktop-connections-in-window-server-2008/

TM

2010年9月16日 星期四

Sybase Power Designer 連接 SQL Server 2008/ 2005


利用 Sybase Power Designer 工具來做 Schema Report 已經是專案中必走的路子
但最近發現 12, 15 版本連結 SQL Server 2008 總是會出現以下惱人的問題

Unable to list the tables.
[Microsoft][ODBC SQL Server Driver][SQL Server]陳述式無法準備。
SQLSTATE = 37000

後來 Google 了一下, 發現原來是資料庫相容的問題
利用以下 SP 可以調整相容度

EXEC SP_DBCMPTLEVEL '您的資料庫', '90'; 


80 是與 2000 相容
90 是與 2005 相容
100 是與 2008 相容

好像 Sybase PD 12, 15 與 SQL Server 2008 向容度不是很好
山不轉路轉, 調整一下相容度就可以解決這個問題



2010年9月11日 星期六

Visual Studio 2008 連結 SQL Server 2008

在資料設定連結時,系統出現以下錯誤


無法開啟到資料庫間的連接
"不支援此伺服器版本。僅支援 Microsoft SQL Server 2005 以上的伺服器。"


解決方式: 趕快去更新 Visual Studio 2008  Service Pack 1 吧 (約 900M) 

2010年8月17日 星期二

.NET 的四捨五入處理

這篇寫的真好

Round 真的是四捨五入嗎

在 .NET 中四捨五入最好採用
Math.Round(number, 0, MidpointRounding.AwayFromZero);
否則 Math.Round(???.5) 出現的結果一定會讓您吃驚

2010年8月8日 星期日

裝置管理員一片空白

<< 資料來源, 網路 >>
解決裝置管理員一片空白2個步驟
1.
開啟「控制台」
點選「系統管理工具」→「服務」
找到「PLUG and PLAY」 將之重新啟動
2.
開始
執行
regedt32
找尋HKEY_LOCAL_MACHINE→system→currentcontrolset→enum
滑鼠移至enum按右鍵
點選「使用權限」
點選administrators(或system)
按下進階
在下方『從父項繼承到子物件的權限項目,以顯示於此套用到子物件的項目物』打勾
按「套用」、「確定」

然後再重新執行裝置管理員
所有的裝置就會出現了

這招不用開機喔!! 

2010年7月28日 星期三

如何輸入¥

從 Wiki 找到的資料 ...

在日文微軟作業系統中,「¥」符號在代碼頁932中的代碼與「\」符號在ASCII中的代碼相同,都是92(在十六進制中為5C)[2]。在Microsoft Windows作業系統中,如果鍵盤沒有能直接輸入「¥」的按鍵,可以通過以下步驟輸入「¥」符號:

1. 按下 alt 鍵;在鍵盤右側的數字鍵盤處輸入「0165」;鬆開 alt 鍵。
2. 在Microsoft Word中,可以先鍵入「00A5」或「00a5」,然後按下alt+X鍵輸入「¥」符號。

2010年7月15日 星期四

流水號

SQL Server 的資料列流水號
select ROW_NUMBER() over (order by column) , ...
Oracle  的資料列流水號
select rownum, ...

2010年6月8日 星期二

半型轉全型

若需要半形轉全型,只要呼叫以下的功能就可以完成. 簡單吧!


private string ToWideStr(String value)
{
// 1028 - TAIWAN
return Microsoft.VisualBasic.Strings.StrConv(value, Microsoft.VisualBasic.VbStrConv.Wide, 1028);
}

// 轉簡體字也很好用!
Microsoft.VisualBasic.Strings.StrConv("中文測試", Microsoft.VisualBasic.VbStrConv.SimplifiedChinese, 2052)

2010年5月31日 星期一

安裝 SQL Server 2008

安裝 SQL Server 2008 不是件難事
因為安裝程式會一步一步的帶您往前走
但是遇到最後的關頭
系統總是跟您說系統出現錯誤
這時就像火車快要進站,但是就是到不了目的地
還很快的倒退嚕!真是惱人

觀察了一下失敗的原因
主要有幾個關鍵
1. 不要同時裝 SQL Server 2005/ SQL Server 2008 (就將 SQL Server 2005 忘了吧)
2. 系統中有一個 "MSXML 6 Service Pack 2 (KB954459)",如果裝了, 請先移除它, 接著再安裝 SQL Server 2008, 應該就可以順利安裝 完成!
3. 上述有時會遇到如何移都一不掉 (MS 的安裝程式真是讓人皺起眉頭, 啥玩意!!)
4. Google 了一下發現原來還有個強力"清除劑"
http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe
就可以清掉 MSXML6 Service Pack 2

這時安裝就可以一路到底了
我試過 XP/ Windows 2003 都可以成功的安裝完成 SQL Server 2008

2010年5月24日 星期一

如何查詢欄位中有 '/' 或其他分割符號的資料

首先說明, 本篇功能只適用於 Oracle 9i 以上

先建立以下的 Collection Type

CREATE TYPE tstrings AS TABLE OF VARCHAR2(1000);

再來建立兩個 Function

一個是分割用的的 function (Split), 這是網路找到的(推!)

CREATE OR REPLACE FUNCTION Split

(

PC$Chaine IN VARCHAR2, -- input string

PN$Pos IN PLS_INTEGER, -- token number

PC$Sep IN VARCHAR2 DEFAULT ',' -- separator character

)

RETURN VARCHAR2

IS

LC$Chaine VARCHAR2(32767) := PC$Sep || PC$Chaine ;

LI$I PLS_INTEGER ;

LI$I2 PLS_INTEGER ;

BEGIN

LI$I := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos ) ;

IF LI$I > 0 THEN

LI$I2 := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos + 1) ;

IF LI$I2 = 0 THEN LI$I2 := LENGTH( LC$Chaine ) + 1 ; END IF ;

RETURN( SUBSTR( LC$Chaine, LI$I+1, LI$I2 - LI$I-1 ) ) ;

ELSE

RETURN NULL ;

END IF ;

END;


另一個 function 則是建立將分割的字串轉成 Collection

CREATE OR REPLACE FUNCTION cosites

( v_cosites varchar2, delimiter varchar2 default '/') RETURN TSTRINGS IS

result TStrings := TStrings();

i integer;

str varchar(100);

BEGIN

i := 1;

loop

str := split(v_cosites, i, delimiter);

exit when str is null;

result.extend(1);

result(i) := str;

i := i + 1;

end loop;

return result;

END;

到這邊工具就準備好了,接著試試看結果囉..

select * from Table(cosites('A100/B100/C100'))

結果就會出現

A100

B100

C100