最近在網上看到不少網友因爲在寫 SQL語句時因爲引號引起的問題,我在剛開始用VB的 時候也經常犯這樣或那樣的錯誤,這次將使用的經驗寫出來與大家共享。
* 舉例時以 VB6.0爲依據; * VB與VBScript不同的地方將分別說明; * 數據庫連結用 ADO。
要點: 在 VB&VBScript中,標記字符串變量內容用雙引號,用兩個連續的雙引號表示字符串中 的雙引號; 在 SQL語法中,標記字符串變量內容用單引號,用兩個連續的單引號表示字符串中的單 引號。
在 VB&VBScript中訪問數據庫的時候最常用的是以下兩種語句: 1、選擇查詢(select),返回結果集; 2、動作查詢(update、insert、delete等),無結果集。
無論哪一種語句,經常需要根據用戶的輸入來構造符合 SQL語法的字符串,提交給連結 對象或結果集對象來執行(open或 execute方法),在 VB&VBScript中,標記字符串變量內 容用雙引號,如 strSql="select * from UserList" 在 SQL語法中,標記字符串變量內容用單引號,如: select * from UserList where UserName='MouseFly'
如果程序的窗口(瀏覽器的頁面)上有兩個文本框用於讓用戶輸入登記註冊的用戶信息 或者是查詢條件,假設用戶輸入了“MouseFly”、“1234”,需要登記到數據庫的一個用戶 註冊表 UserList中,則SQL字符串應如下組織: strSql="insert into UserList (UserName,Password) values (" & _ "'" & me.txtUserName.text & "'," & _ "'" & me.txtPassword.text & "')" 生成的結果爲: insert into UserList (UserName,Password) values ('MouseFly','1234') 但是如果用戶輸入中包含了單引號,如“12'3”,按照上面的組織方法則爲: insert into UserList (UserName,Password) values ('MouseFly','12'3') 這時再執行的時候,會提示 SQL語法錯誤,原因就在於“12'3”中的單引號,由於在 SQL語 法中,標記字符串變量內容用單引號,因此“'12'3'”無法被正確識別,所以在組織字符串 的時候要考慮將用戶輸入的單引號替換成兩個連續的單引號,此時要用到Replace函數: strSql="insert into UserList (UserName,Password) values (" & _ "'" & replace(me.txtUserName.text,"'","''") & "'," & _ "'" & replace(me.txtPassword.text,"'","''") & "')" 結果爲: insert into UserList (UserName,Password) values ('MouseFly','12''3') 如果使用的是VBScript則me.txtUserName.text和me.txtPassword.text要換成相應的瀏覽器 提交的內容,如request.form("UserName")和request.form("Password")。 如果賦值的字段類型是數字型的,則要去掉字符串兩端的單引號,假設Password字段是 數值型,並且用戶輸入的是“1234”,則(此處略去數字輸入校驗): strSql="insert into UserList (UserName,Password) values (" & _ "'" & me.txtUserName.text & "'," & _ me.txtPassword.text & ")" 生成的結果爲: insert into UserList (UserName,Password) values ('MouseFly',1234)
如果字段類型是日期型,在 ADO中和處理字符串差不多,只不過要注意日期型字段的格 式,最好在組織 SQL字符串的時候對日期進行格式化保證年份是4位,如: strSql="insert into UserList (UserName,Password,BirthDay) values (" & _ "'" & me.txtUserName.text & "'," & _ me.txtPassword.text & "," & _ "'" & format(me.txtBirth.text,"yyyy-mm-dd") & "')" 生成的結果爲: insert into UserList (UserName,Password,BirthDay) values ('MouseFly',1234,'1975-01-15') 如果使用的是VBScript,對日期進行格式化使用FormatDatetime函數。
|