close

VBScript 中單引號、雙引號的問題

Allen Kuo
最近修改日期: 2002/10/25

QUESTION

ASP Server Side 程式碼中, 尤其是混雜 SQL 語法時, 往往單引號 雙引號 很多, 對初學者而言, 常常分不清楚

fldA="AAA" fldB=123 fldC="2002/1/22" strsql="INSERT INTO myTable(colA,colB,colC)VALUES("& _ "'" & fldA & "'," & _ fldB & "," & _ "'" & fldC & "'" & _ ")"

上方的程式碼, 究竟在寫些什麼呢 ?

 

ANSWER

在撰寫ASP時, SQL 語法, 常常因為單引號, 雙引號的問題發生程式錯誤, 因此, 在此說明一下大致的用法。

VBScript 雙引號 (")

在 VBScript 中, 可以用雙引號將字串變數括起來, 例如 strSQL = "INSERT INTO MyTable"
若只是數值, 則不必加雙引號, 例如 myAge = 18
若字串中剛好也有雙引號時, 可以用二個雙引號來表示一個雙引號, 例如
strDesc="我家住""台北"", 不是""台中""" 。藍色雙引號是原本就應該有的, 如果你要寫的字串中間包含雙引號, 如上例所示, 想存放的字串是 我家住"台北", 不是"台中" 那麼便要用二個雙引號來代替一個雙引號。

如果你不小心將程式誤寫成 strDesc="我家住"台北"", VBScript 會以為你寫的是"我家住"台北"" , 二個字串, 並且用台北串連, 當然會發生錯誤, 因為語法不對。

VBScript 不將單引號視為特別的符號, 因此, strDesc="我家住'台北'" or strDesc="This's a book." 都是正確的程式碼。

雙引號必需成對, 以下程式碼都是錯誤的:

myString = "aaa		'後面少了雙引號

myString = "第一行

	第二行"		'程式碼不能分成二行

 

VBScript 串連運算子 (&)

用途: 強迫將兩個運算式進行字串串連。

語法: result = expression1 & expression2
範例: strSQL="INSERT INTO " & "MyTable" -->此時 strSQL 變數值為 INSERT INTO MyTable

附註
當 expression 不是字串時,它將會被轉換成 String 資料型態。如果兩個運算式都是 Null,則 result 也會是 Null。然而,如果只有一個 expression 是 Null,則在與其它運算式串連時,它都會被當成長度為零的字串 ("")。任何型態為 Empty的運算式也都將當成長度為零的字

 

SQL 語法的單引號(')

如果你要新增記錄, SQL 的寫法大致如下:

INSERT INTO MyTable(vch_Name,i_Sex,dt_Birth)VALUES('Allen', 18, '1950/1/23')

你可以直接將這段貼到 SQL Server 中並且能正確執行, 請注意, 日期或文字, 在SQL 語法中是以單引號,而非雙引號。那麼, 如果字串中有包含單引號時, 如何寫呢 ? 與 VBScript 的雙引號狀況類似, 是以二個單引號代替, 例如:

INSERT INTO MyTable(vch_Name,vch_Message)VALUES('Allen','This''s a book.')

二個紅色的單引號會變成一個單引號存入資料庫中。

 

結論

那麼, 如果你在寫 ASP 時, 要如何寫它呢? 程式碼大致如下:

strSQL="INSERT INTO MyTable(vch_Name,vch_Sex,dt_Birth)VALUES('Allen', 18, '1950/1/23')"
strSQL="INSERT INTO MyTable(vch_Name,vch_Message)VALUES('Allen','This''s a book.')"

但由於通常這些欄位值都是由上一頁使用者輸入值而定, 因此, 寫法要稍微改一下,將欄位值用變數取代, 並使用串連運算子(&) 來連結

fldvch_Name=Request("vch_Name")
fldi_Sex=Request("i_Sex")
flddt_Birth=Request("dt_Birth")

fld strSQL="INSERT INTO MyTable(vch_Name,i_Sex,dt_Birth)VALUES('" & fldvch_Name & "'," & fldi_Sex & ", '" & flddt_Birth & "')"

fldvch_Message=Request("vch_Message")
fldvch_Message=Replace(fldvch_Message,"'","''") '將一個單引號換成二個單引號
strSQL="INSERT INTO MyTable(vch_Name,vch_Message)VALUES('" & fldvch_Name & "','" & fldvch_Message & "')"

這樣就差不多了, 有時候, 由於欄位較多, 以致程式碼過長, 會超過一個螢幕的寬度, 因此, 為了閱讀方便, 可以使用底線將程式分成二行, 但VBScript 仍會將它們視為一行程式碼, 例如:

strSQL="INSERT INTO MyTable(vch_Name,i_Sex,dt_Birth)VALUES(" & _ "'" & fldvch_Name & "'," & _ fldi_Sex & "," & _ "'" & flddt_Birth & "'" & _ ")"
如此, 以後維護時, 便很容易閱讀, 即使以後要增加一個欄位也很容易修改。
arrow
arrow
    全站熱搜

    icejuly 發表在 痞客邦 留言(0) 人氣()