Monday, December 24, 2007 - 文章

TIPS-Case Sensitive In Oracle Table/Column Name

印象中,ORACLE的Table Name, Column Name都是不分大小寫的。不過今天我摔了第二次,決心把這個Tip寫下來...

建Oracle Table,大部分我會徒手寫CREATE TABLE Script,偶爾偷懶會用Aqua Data Studio。今天用想驗證Transaction,於是用Aqua Data Studio的管理UI建了一個Table: Jeffrey。資料表建出來了,UI上看得到,但SELECT * FROM Jeffrey卻一直得到ORA-00942: table or view does not exist的訊息。

印象中之前似乎遇過一次,但原因、解法完全不記得了。求救同事,她檢查Table Create Script看到以下寫法:
CREATE TABLE "Jeffrey"
(
  "EmpNo"  NUMBER(3)                            NOT NULL,
  "Name"   VARCHAR2(16 BYTE)                    NOT NULL
)

這下子我全都想起來了,原來使用Aqua Data Studio建立資料表時,會忠實地保留使用者輸入的大小寫,等於在下指令時,用雙引號包住Table Name, Column Name。一般指令中,未包雙引號的名稱則會一律轉成大寫,所以SELECT * FROM Jeffrey其實會去找名為"JEFFREY"的資料表,因而擦身而過。

這問題以前遇過一次,偷懶沒記下來的結果是很久之後又花了時間摸索第二次(雖然這次有貴人相助,很快得到答案,但還是花了時間),That's why you see this post.

KB-給ASPX義大利麵寫法的好人卡

上回我提了一個解決套用MasterPage時ClientID會突變的方法,其中提到: 我不喜歡document.getElementById('<% =TextBox1.ClientID%>').value這種ASP時代義大利麵式的寫法。

網友eric問: 為什麼不愛?

義大利麵先生,你是個好人,但是...

第一個理由是我喜歡Server-Side Logic編譯過並藏在DLL中,不要顯露在易被取得的ASPX內。不過,在這個應用情境上我們只用來標示WebControl.ClientID,稱不上是後端邏輯,原則上這點可以忽略。

第二個理由是我不喜歡在網頁裡夾帶<% ... %>這種ASP/ASPX專屬語法。在開發網站時,我常會先做一個配色噁心、版面混沌,只有程式設計師搞得出來,也只有程式設計師可以忍受的醜小鴨網頁,再交給團隊中的美學達人(我不喜歡稱這群專家叫美工,對一個配色殘障來說,她們是神~~~)用巧手變成天鵝。當網頁中摻雜了這些ASPX獨有語法,就容易因其他廠牌設計工具無法識別而在處理過程中受損。

第三個理由跟效能有點關係。所有的ASPX的內容,最後都會變成一個.cs檔,其中Client-Side Script、純HTML Tag等,都會被轉成字串處理,每用一次<% ... %>,就會切割出兩段字串。有點抽象是吧? 我用以下的例子說明:

<body>
    <form id="form1" runat="server">
    <div>
    </div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
&nbsp;<asp:Button ID="Button1" runat="server" Text="Button" />
    <br />
    <script type="text/javascript">
    alert('<% =TextBox1.Text %>');
    alert("<% =Button1.Text %>");
    </script>
    </form>
</body>

以上的寫法,實際上會被轉成以下的C# Code:

private void __Renderform1(HtmlTextWriter __w, Control parameterContainer)
{
    __w.Write("\r\n    <div>\r\n    \r\n    </div>\r\n    ");
    parameterContainer.Controls[0].RenderControl(__w);
    __w.Write("\r\n&nbsp;");
    parameterContainer.Controls[1].RenderControl(__w);
    __w.Write("\r\n    <br />\r\n    
<script type=\"text/javascript\">\r\n alert('"
);
    __w.Write(base.TextBox1.Text);
    __w.Write("');\r\n    alert(\"");
    __w.Write(base.Button1.Text);
    __w.Write("\");\r\n    </script>\r\n    ");
}

其中parameterContainer.Controls[0]就是TextBox1、parameterContainer.Controls[1]就是Button1。我們看到_Renderform1先吐出<div></div>,接著請TextBox1產生對應的HTML Tag,然後是&nbsp;,再來輪Button1產生對應的HTML Tag。接下來有意思了,如果我們這裡只是單純的Javascript Block,理論上應該一個__w.Write就會把整個Script Block輸出完。但因為我們用了<% =TextBox1.Text %>與<% =Button1.Text %>,所以整個Script Block被拆成五段輸出。分五次呼叫__w.Write,即使差異有限,但肯定會比一次呼叫來得沒效率,如果可以避免,我還是會設法閃過。

以上是我不愛義大利麵式寫法的理由,原則上這種寫法並非萬惡不赦,只是與我慣用的開發方式與哲學有點違背,算是個人偏好下的結論,這裡就細說從頭,給大家參考參考囉!

搜尋

Go

<December 2007>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication