oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"说明:DelKeyWords(ByVal InitStr As String)是一个自定义函数,用于清除字符串中包含的数据库关键字和VB限制字符
由于数据库中存在大量包含关键字、转义字符的记录,查询的时候频繁出错,如何才能将自定义函数插入到sql语句中呢?例如:sql = "Select * From " & UBnm & " Where " & wherfld & "=DelKeyWords('" & oldtxtinf & "')"
数据库是ACCESS2003
返回String
oldtxtinf = Lab(1).Caption & Lab(2).Caption '记录原始信息
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"
sql=DelKeyWords(sql)
举个例子:
如果Lab(1).Caption & Lab(2).Caption='一|二"三,四.五
则DelKeyWords(Lab(1).Caption & Lab(2).Caption)=一二三四五
oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
wherfld = "name & tel" '这是你字段名称?
sql = "Select * From " & UBnm & " Where [" & wherfld & "] ='" & DelKeyWords(Lab(1).Caption & Lab(2).Caption) & "'"
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"这三行有什么问题么?
等于
wherfld = "name & tel"
二个字段合并?是不是应该:
wherfld = "name" & "tel"
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & DelKeyWords(Lab(1).Caption & Lab(2).Caption) & "'"也可以这样
oldtxtinf = Lab(1).Caption & Lab(2).Caption '记录原始信息
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & DelKeyWords(oldtxtinf) & "'"
你可以使用嵌套的SQL语句
按这个意思
应该这样
oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & DelKeyWords(wherfld) & "='" & DelKeyWords(oldtxtinf) & "'"但是这样wherfld可能已经不是你想要的了
字段tel的值 = 1|3:9;9<9>9[9]9,9=9{9}
这是一个被破坏了的数据表
wherfld = name & tel = 张'三1|3:9;9<9>9[9]9,9=9{9}
oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) = 张三13999999999
此时"select * from table where " & wherfld & " = '" & oldtxtinf & "'"的执行显然存在两个问题:
1.如果数据库对wherfld中的那些特殊字符存在限制,那就会出现字符串表达式错误,那些特殊字符把SQL语句弄得面目全非无法执行了。
2.即使不存在特殊字符限制,这条语句也是查不到任何数据的,我要找"张三13999999999"的用户,根本找不到,因为where子句中给出的条件是"张'三1|3:9;9<9>9[9]9,9=9{9}"。
因此,需要将wherfld中的特殊字符清除掉,使wherfld = name & tel = 张三13999999999
但是这只是方法,没有实现的可能,因为name和tel中都有特殊字符,根本取不出来。
vb中写的函数不会在SQL语句中执行,也就是你想过虑name & tel是不可能的。这个情况如果是SQL数据库可以在数据库中自定义函数解决,ACCESS这个方法是不行的这类问题解决的根本之道就是参数化查询....
sql = "Select * From " & UBnm & " Where " & 张'三1|3:9;9 <9>9[9]9,9=9{9} & "='" & 张三13999999999 & "'"
就是这样,where子句错误,关键在于如何将where子句中用作条件的字段值张'三1|3:9;9 <9>9[9]9,9=9{9}中的特殊符号清除掉(如果DelKeyWords(张'三1|3:9;9 <9>9[9]9,9=9{9})出现未定义错误,ACCESS不支持查询语句中使用自定义函数)
Dim cmd As ADODB.Recordset
Dim sql As String
Set cn = New ADODB.Connection
cn.Open "..." sql = "SELECT * FROM tb WHERE [name]=@1 And tel=@2"
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = sql
cmd.CommandType = adCmdText
Set param = cmd.CreateParameter("@1", adVarChar, adParamInput, 20, "张'三")
cmd.Parameters.Append param
Set param = cmd.CreateParameter("@2", adVarChar, adParamInput, 50, "1|3:9;9 <9>9[9]9,9=9{9}")
cmd.Parameters.Append param
Set rs = cmd.Execute
Set rs = Nothing
Set cmd = Nothing
Set cn = Nothing
全部拿到vb中来处理2。用存储过程,access中貌似没有,但网上说有办法让access也用存储过程
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & " like '" & oldtxtinf & "' "
oldtxtinf = Replace(Lab(1).Caption & Lab(2).Caption, "'","''")
wherfld = "name" & " & " & "tel"
sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"