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

解决方案 »

  1.   

    DelKeyWords(ByVal InitStr As String)
    返回String
      

  2.   

    我猜应该是这样
    oldtxtinf = Lab(1).Caption & Lab(2).Caption '记录原始信息
    wherfld = "name" & " & " & "tel"
    sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"
    sql=DelKeyWords(sql)
      

  3.   


    举个例子:
    如果Lab(1).Caption & Lab(2).Caption='一|二"三,四.五
    则DelKeyWords(Lab(1).Caption & Lab(2).Caption)=一二三四五
      

  4.   

    那SQL就不再是一条查询语句了,所有符号都被清除了
      

  5.   


    oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
    wherfld = "name & tel"  '这是你字段名称?
    sql = "Select * From " & UBnm & " Where [" & wherfld & "] ='" & DelKeyWords(Lab(1).Caption & Lab(2).Caption) & "'"
      

  6.   

    wherfld是两个字段值合并后的字符串(字段值),字段值可能存在限制字符,我的目的是要把wherfld中包含的特殊字符都清除掉(DelKeyWords(wherfld)),再与oldtxtinf进行比对。
      

  7.   

    oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
    wherfld = "name" & " & " & "tel"
    sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"这三行有什么问题么?
      

  8.   

    wherfld = "name" & " & " & "tel"
    等于
    wherfld = "name & tel"
    二个字段合并?是不是应该:
    wherfld = "name" & "tel"
      

  9.   

    是的,name和tel都是字段名称,我把它合并到wherfld变量中,但是在where子句中需要把wherfld中包含的限制字符都清除掉再做比对,即where DelKeyWords(name & tel)=DelKeyWords(Lab(1).Caption& Lab(2).Caption)
      

  10.   

    可以这样
    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) & "'"
      

  11.   

    字段不能那样合并
    你可以使用嵌套的SQL语句
      

  12.   


    按这个意思
    应该这样
    oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
    wherfld = "name" & " & " & "tel"
    sql = "Select * From " & UBnm & " Where " & DelKeyWords(wherfld) & "='" & DelKeyWords(oldtxtinf) & "'"但是这样wherfld可能已经不是你想要的了
      

  13.   

    字段name的值 = 张'三
    字段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
      

  14.   

    我也想过变通的笨办法,就是先分别把name和tel取出来存放到两个字符串变量a和b,将两个字符串变量合并为一个c,最后使用这个c来作条件,即where " & a & "='" & oldtxtinf & "'
    但是这只是方法,没有实现的可能,因为name和tel中都有特殊字符,根本取不出来。
      

  15.   

    如果表中数据是:张'三1|3:9;9 <9>9[9]9,9=9{9},那么:
    vb中写的函数不会在SQL语句中执行,也就是你想过虑name & tel是不可能的。这个情况如果是SQL数据库可以在数据库中自定义函数解决,ACCESS这个方法是不行的这类问题解决的根本之道就是参数化查询....
      

  16.   


    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不支持查询语句中使用自定义函数)
      

  17.   

    access参数化查询示例:    Dim cn As ADODB.Connection
        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
      

  18.   

    sql = "SELECT * FROM tb WHERE [name]=@1 or tel=@2"
      

  19.   

    sql = "SELECT * FROM tb WHERE [name]=@1 or tel=@2"
      

  20.   

    两个解决方案1。lz既然数据库中很多这样的数据,而且是要处理,干脆不要加条件查询,直接select * from mytable
    全部拿到vb中来处理2。用存储过程,access中貌似没有,但网上说有办法让access也用存储过程
      

  21.   

    lz如果要使用这些数据,可以把数据中的特别字符替换成“?”,用like来查询
      

  22.   

    也就是说DelKeyWords函数中不是把特别字符去掉,而是换成“?”oldtxtinf = DelKeyWords(Lab(1).Caption & Lab(2).Caption) '记录原始信息
    wherfld = "name" & " & " & "tel"
    sql = "Select * From " & UBnm & " Where " & wherfld & " like '" & oldtxtinf & "' "
      

  23.   

    不就是字符串值中含有特殊字符 ' 时你不知道如何拼 SQL 的问题,很简单:用两个 '' 表示一个 '
    oldtxtinf = Replace(Lab(1).Caption & Lab(2).Caption, "'","''")
    wherfld = "name" & " & " & "tel"
    sql = "Select * From " & UBnm & " Where " & wherfld & "='" & oldtxtinf & "'"