SQL查询或其他操作的时候,如果遇到一个单引号的情况查询会报错的,比如:
query1.sql.text:='select * from tablename where filedname='+#39+edit1.text+#39;
//edit1.text中如果有一个英文状态下的单引号,就会报错,以前是TEXT字段类型的时候是用一个其他的字符组合替换掉单引号,显示的时候在将字符组合换成单引号,可如果字段多了的话总不能每个字段都这么样替换吧?再说要是在表格中显示根本就不知道怎么去替换回来。
对此,不知道在实际中是如何解决的?如果有什么好的解决办法还不吝赐教,谢谢!!

解决方案 »

  1.   

    query1.sql.text:='select * from tablename where filedname='''+edit1.text+'''';
      

  2.   

    写法的问题,具体解决方法参考我去年发的贴子:
    http://community.csdn.net/Expert/TopicView.asp?id=3651031
      

  3.   

    query1.sql.text:='select * from tablename where filedname='''+edit1.text+'''';
      

  4.   

    先写一个函数,用来改造edit.text,在每一个单引号后加多一个单引号;
    函数返回改造后的字符串,然后再按正常的没有单引号的写法就可以了。你可以在外部,如edit1中的onkeypress事件上输入
    if key='''' then key=#0;这种在edit1框中就不能输入单引号了
    你也可以在程序中用try except来去掉这种错误
      

  5.   

    或者你看看下面的写法
    -------------------------------------
    Query.SQL.Clear;
    Query.SQL.Add(format('insert TABLE values (''%s'',''%s'')', [Edit1.Text, Edit2.Text]));
    Query.SQL.Execsql;
    或者:
    Query.SQL.Clear;
    Query.SQL.Add('insert TABLE values (');
    try
    Query.SQL.Add(Inttostr(strtoint(Edit1.Text)));
    except 
      showmessage('error');
      exit
    end;
    Query.SQL.Add(',');
    Query.SQL.Add(Inttostr(strtoint(Edit2.Text)));
    except 
      showmessage('error');
      exit
    end;
    Query.SQL.Add(')');
    Query.SQL.Execsql;
      

  6.   

    query1.sql.text:='select * from tablename where filedname=:arg1';
    query1.parameters.parametervalues['arg1']:=edit1.text;
      

  7.   

    强烈建议楼主不要这样做,很容易就让别人sql注入了~
    你可以这样写
    我平时都是这样写的
     try
      with adoquery1 do
      begin
        close;
        sql.Clear;
        sqll:='insert into xs values (:a,:b,:c,:d,:e,:f,:g,:h,:i,:j)';
        sql.Add(sqll);
        Parameters[0].Value:=edit2.Text;
        Parameters[1].Value:=edit3.Text;
        Parameters[2].Value:=edit4.Text;
        Parameters[3].Value:=edit5.Text;
        Parameters[4].Value:=edit6.Text;
        Parameters[5].Value:=edit7.Text;
        Parameters[6].Value:=edit8.Text;
        Parameters[7].Value:=edit9.Text;
        Parameters[8].Value:=edit10.Text;
        Parameters[9].Value:=edit11.Text;
        execsql;
        showmessage('插入成功');
      end;
      except
        showmessage('error');
      end;
      

  8.   

    在网上一些论坛比如dvbbs因为就是香楼主这样,很容易得就可以实行sql注入,我在dvbbs7.0中找到好几个地方,可以获得管理员权限
    所以千万不要这样写,麻烦大了~
      

  9.   

    hellolongbin(一个人[网络能你给的,不就是个数字吗?]) :我觉得那个答案也不完全,如果我想生成这样的语句呢:query1.sql.text:='select * from tablename where filedname='+#39+'%s'+edit1.text+#39 +
    ' and filedname2='+#39+edit2.text+#39;
      

  10.   

    那就只能用参数parambyname来处理,而不能用拼凑字符串的方法。
    因为ASP里有一种黑客方法就是采用类似的方法,取得高权限。
      

  11.   

    query1.parameters.parametervalues['arg1']:=edit1.text;
    可以变成
    query1.parameters.parametervalues['arg1']:='%'+edit1.text+'%';
      

  12.   

    strSQL:='select * from tablename where fieldname='''+
            StringReplace(SearchEdit.Text,'''','''''')+
            '''';
      

  13.   

    strSQL:='select * from tablename where fieldname='+#39+
            StringReplace(SearchEdit.Text,#39,#39#39)+#39;
      

  14.   

    我覺得有兩種方法解決:
    1.用參數的方式
    2.用QuotedStr函數即可如:
    query1.sql.text := 
      'select * from tablename where filedname=' + Quotedstr(edit1.text);
      

  15.   

    我不喜欢用参数查询,因为他要编写多的代码,程序阅读起来混乱,不过要是用Quotedstr的话问题解决了,不过要是字段多了光写Quotedstr也要写好多,但是也只能这样了。
    帖子再保留两天,看还有没有更好的办法?
      

  16.   

    我也遇到过同样的问题,告诉你(四个单引号代表一个单引号)
    query1.sql.text:='select * from tablename where filedname='+#39+edit1.text+#39;
     
    应该为:query1.sql.text:='select * from tablename where filedname ='+''''+edit1.text+'''';
    千万要记得空格哟.
      

  17.   

    这个问题我已经回答了很多次了,
    query1.sql.add('select * from tablename where filedname ='+quotedstr(edit1.text);
      

  18.   

    很久以前遇到过,当时好象是用两种方法解决的
    1、format()函数
    2、用'''代替'
    要不试试?
    呵呵
      

  19.   

    query1.sql.text:='select * from tablename where filedname='+QyotedStr(edit1.text);
    如果 Edit1.Text 有引号也不用怕,这个函数会自转换,不会出错。
    你试试这个函数的执行结果就知道了。
      

  20.   

    有一个字母打错了不好意思。
    query1.sql.text:='select * from tablename where filedname='+QuotedStr(edit1.text);
    如果 Edit1.Text 有引号也不用怕,这个函数会自转换,不会出错。
    你试试这个函数的执行结果就知道了。
      

  21.   

    用参数啦:
      query1.sql.text:='select * from tablename where filedname=:arg1';
      query1.parameters.parametervalues['arg1']:=edit1.text;
      

  22.   

    用参数太麻烦,俺一直是用QuotedStr函数,特好使,刚才实验了一下,关键字包含引号也没有问题
      

  23.   

    强烈反对
    select * from tb1 where xx=''''+edit1.text+'''';
    这种写法
    很容易出现错误
    我说过,在dvbbs7.0中,就是因为这样的漏洞,很容易被我去的管理员的权限,安全啊安全啊!
    如果觉得麻烦  QyotedStr是个选择