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