2019/3/26 12:38:44
接到(dào)一個(gè)鑫冠獨立服務器(qì)客戶的(de)反饋,在進行(xíng)數據庫的(de)查詢時,出現報錯,無法讀(dú)取數據庫,經過我們的(de)檢查發現其修改了數據庫密碼,其中使用(yòng)了微軟數據庫不準許的(de)特殊字符:
例如(rú)一個(gè)用(yòng)戶數據庫中查詢他(tā)的(de)用(yòng)戶名和(hé)他(tā)的(de)密碼,但(dàn)恰好該用(yòng)戶使用(yòng)的(de)名字和(hé)密碼中有(yǒu)特殊的(de)字符,例如(rú)單引号,“|”号,雙引号或者連字符“&”。
例如(rú)他(tā)的(de)名字是1"test,密碼是A|&900
這時當執行(xíng)以下的(de)查詢語句時,肯定會(huì)報錯:
SQL = "SELECT * FROM SecurityLevel WHERE UID="" & UserID & """
SQL = SQL & " AND PWD="" & Password & """
因爲SQL将會(huì)是這樣:
SELECT * FROM SecurityLevel WHERE UID="1"test" AND PWD="A|&900"
在SQL中,"|"爲分(fēn)割字段用(yòng)的(de),顯然會(huì)出錯了。現在提供下面的(de)幾個(gè)函數 專門用(yòng)來處理(lǐ)這些頭疼的(de)東西(xī):
Function ReplaceStr (TextIn, ByVal SearchStr As String, _
ByVal Replacement As String, _
ByVal CompMode As Integer)
Dim WorkText As String, Pointer As Integer
If IsNull(TextIn) Then
ReplaceStr = Null
Else
WorkText = TextIn
Pointer = InStr(1, WorkText, SearchStr, CompMode)
Do While Pointer > 0
WorkText = Left(WorkText, Pointer - 1) & Replacement & _
Mid(WorkText, Pointer + Len(SearchStr))
Pointer = InStr(Pointer + Len(Replacement), WorkText, SearchStr, CompMode)
Loop
ReplaceStr = WorkText
End If
End Function
Function SQLFixup(TextIn)
SQLFixup = ReplaceStr(TextIn, """, """", 0)
End Function
Function JetSQLFixup(TextIn)
Dim Temp
Temp = ReplaceStr(TextIn, """, """", 0)
JetSQLFixup = ReplaceStr(Temp, "|", "" & chr(124) & "", 0)
End Function
Function FindFirstFixup(TextIn)
Dim Temp
Temp = ReplaceStr(TextIn, """, "" & chr(39) & "", 0)
FindFirstFixup = ReplaceStr(Temp, "|", "" & chr(124) & "", 0)
End Function
有(yǒu)了上(shàng)面幾個(gè)函數後,當在執行(xíng)一個(gè)sql前,請先使用(yòng)
SQL = "SELECT * FROM SecurityLevel WHERE UID="" & SQLFixup(UserID) & """
SQL = SQL & " AND PWD="" & SQLFixup(Password) & """
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967