在VB6中执行之前验证SQL查询完整性

时间:2015-10-12 11:38:58

标签: sql vb6

我有一个MS Access 2003应用程序当前移植到Visual Basic 6.0。为此,我写了一份通常在Access中使用的DLookup的副本。

到目前为止,这是代码。

Public Function cDLookup(TargetField As String, TargetTable As String, cTCondition As String) As String
'Eigene Implementation von DLookup
Dim result As String
Dim rs As New ADODB.Recordset
Dim SQL As String
On Error GoTo Fehlerbehandlung

'Zusammenbauen der Query
SQL = "SELECT " & TargetField & " FROM " & TargetTable & " WHERE " & cTCondition

Call dbConn
'Initiate Database connection object cn

rs.Open SQL, cn
If (rs.RecordCount = 1) Then
result = cleanString(rs.GetString)
Debug.Print ("[DLOOKUP] Erfolgreich Einen Datensatz gefunden und konvertiert. Output: " & result)

ElseIf (rs.RecordCount > 1) Then
result = "#ErrRC"
Debug.Print ("[DLOOKUP] Es wurden " & CStr(rs.RecordCount) & " Datensätze statt einem festgestellt. Dies ist nicht erlaubt")

Else
result = "#ErrGen"
Debug.Print ("[DLOOKUP] Es ist ein Fehler in der Abfrage aufgetreten")
End If
rs.Close

cDLookup = result
Exit Function
Fehlerbehandlung:
Debug.Print ("[DLOOKUP] Fehler im Ausführen der Prozedur cDLookup()]")
cDLookup = "#Fehler"
Exit Function
End Function

我的主要问题是生成的查询。如果用户键入输入到其中的垃圾,则打开记录集时ADODB会发生运行时错误。我可以事先验证一个SQL查询不会这样做并捕获它不会以某种方式崩溃我的整个程序吗?

2 个答案:

答案 0 :(得分:3)

不,不是你想要的方式。您只需尝试执行它,并优雅地处理错误。你可以做一些像创建一个名为" ValidateSQL"的函数。使用自己的错误处理程序,尝试执行它,如果查询失败则返回false。您甚至可以在byref中传递记录集,并将其设置为在结果通过时获得结果。

很长一段时间,原谅语法错误。像这样:

Function ValidateSQL(ByRef rs as ADODB.Recordset) as Boolean
On Error GoTo Hell
ValidateSQL = True

'open recordset here
Set rs = ....
If False Then
   Hell:
   ValidateSQL = False
End If
End Function

答案 1 :(得分:1)

如果您知道您正在生成垃圾箱,为什么要将垃圾箱带到数据库并等待数据库爆炸以告诉您它的垃圾? 快速失败是有原因的。

点击数据库不是免费。即使它相对较快,它也比普通代码慢几个数量级。

不要误解我的意思,我并不意味着"验证指定的字段名称确实存在于具有指定名称的表格中#34;并且"解析where语句以查看它是否有意义"。

然而,一些健全性检查的成本远低于无用的数据库之旅。你可以:

  • 验证表格和字段名称是否包含任何空格,或用方括号括起来;
  • 验证表格和字段名称是否为空;
  • 验证WHERE子句不以" WHERE"开头,并且它不是空的。

如果这些简单的检查通过,那么然后会让数据库爆炸,如果它们仍然是错误的。