Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用sql查询在delphi中的ado数据库中搜索字段?_Mysql_Sql_Sql Server_Delphi_Delphi 7 - Fatal编程技术网

Mysql 如何使用sql查询在delphi中的ado数据库中搜索字段?

Mysql 如何使用sql查询在delphi中的ado数据库中搜索字段?,mysql,sql,sql-server,delphi,delphi-7,Mysql,Sql,Sql Server,Delphi,Delphi 7,我尝试在delphi上过滤ado数据库表 我有一个dbgrid连接到查询(qryData),只要执行这段代码,dbgrid就会变为空白,没有任何进一步的事情发生。即使我输入了一个有效的字段名,它也应该在dbgrid中显示它,但它什么也没有显示。我做错了什么 procedure TfrmProjects.cbxColumnsSelect(Sender: TObject); begin if edtsearch.Text = '' then begin showmessage('

我尝试在delphi上过滤ado数据库表

我有一个dbgrid连接到查询(qryData),只要执行这段代码,dbgrid就会变为空白,没有任何进一步的事情发生。即使我输入了一个有效的字段名,它也应该在dbgrid中显示它,但它什么也没有显示。我做错了什么

procedure TfrmProjects.cbxColumnsSelect(Sender: TObject);
begin
if edtsearch.Text = '' then
    begin
      showmessage('The search field should be entered');
      exit;
    end
else
    begin
        ssearch:= edtsearch.Text;
        showmessage(ssearch);
    end;

 if cbxColumns.ItemIndex = -1 then
  begin
    showmessage('Please select a field');
    exit;
  end
 else
  begin
    scolumn:= cbxColumns.Items[cbxColumns.itemindex];
    showmessage(scolumn);
  end;

with dmUsers do
begin
  with qryData do
    begin
      sql.Clear;
      sql.Text := 'Select * FROM tbl_projects where' + quotedstr(scolumn) + ' = ' +quotedstr(ssearch);
      open;
    end;
end;

以下内容适合我。您需要将对qryData的引用更改为dmUsers.qryData。顺便说一句,尽量避免使用“with…”

请注意,您正在构造的SQL并不理想,因为它没有考虑正在搜索的列是否属于需要将查询中指定的值括在引号中的数据类型。列名不需要加引号,但如果有嵌入空格,则可能需要方括号[]。在列名周围加上引号是网格变为空白的原因-您要求服务器上的Sql搜索引擎查找的是所有行,其中“一个字符串”等于“另一个字符串”,这对于任何行都是false,因此不会返回任何行。顺便说一句,这与您有时看到的Sql示例有关,其中包含类似于“where 1=2”的where子句;当然,这永远不会是真的,其思想是强制搜索引擎解析查询而不返回任何行

正如@mostkito-x所评论的,原始查询版本的一个主要问题是查询元素之间缺少空间,因此可以自由地使用空格,以便查看您正在做什么。当查询遇到问题时,将其文本放入表单上的备忘(设置为固定的字体,如Courier)并不是一件坏事,这样您就可以观察自己是否在构建自己认为是的查询

顺便说一句,如果您没有收集,在字符串数据类型的搜索值周围使用QuotedStr具有正确处理搜索值具有嵌入引号(如o'Reilly)的情况的优势

此外,还可以通过此类查询了解“SQL注入”恶意软件风险()。人们普遍认为,降低这种风险的措施是使用参数化查询。不幸的是,对于您的任务,虽然您可以指定要匹配的列值作为参数,但无法在ADO中参数化列名

要使用参数化查询,Sql看起来像

从tblProjects中选择*其中SomeColumn=:somevalue


然后,在IDE对象检查器中,您需要在qryData上定义一个参数,并在执行查询之前执行qryData.Parameters.ParamByName('somevalue')。Value:=edtSearch.Text。但是,正如我所说的,您不能参数化要搜索的列名。

从我所看到的来看,问题在于这一行:

sql.Text := 'Select * FROM tbl_projects where' + quotedstr(scolumn) + ' = ' +quotedstr(ssearch);
应该是:

sql.Text := 'Select * FROM tbl_projects where ' + scolumn + ' = ' +quotedstr(ssearch);
第一个QuotedStr用常规单引号引用列名,这将兼容两个字符串值——一个等于列名,另一个等于搜索字符串

如果在列名中使用空格,则应使用适当的字符将其括起来。例如,在MySql中,您应该使用:

sql.Text := 'Select * FROM tbl_projects where `' + scolumn + '` = ' +quotedstr(ssearch);

对不起,我的代码块不是很整洁,“过滤器”这个词可能不适合您的需要。需要明确的是:您试图做的是让用户从组合框中选择用户希望搜索的关联表中的列,提示用户在表列中输入要匹配的值,然后执行Sql查询以查找与查询匹配的表行吗?@user2595912:
。。。其中“+quotedstr(scolumn)
将变成
。。。如您所见,
where
“xyfield”
之间没有空格!MySQL不是您提到的SQL Server+1好:
尽量避免使用“with…”
。您还应该提到,查询通常是由于指令之间缺少空间而失败的。如果您查看已完成的
sqlquery
,大部分都会发现问题所在。@moskitox,是的,很好,我会马上更新我的答案。请调整您的示例并显示参数的用法,否则否+1;)@whosrdad:事实上,关于参数的一点是作为一个旁白,而不是OP真正想问的。同意,但只有一个安全的方法。我很高兴您提到SQL注入,但为了将来的参考,最好在示例中包含参数用法,以便其他用户可以学习如何以正确的方式进行操作…:)
sql.Text := 'Select * FROM tbl_projects where `' + scolumn + '` = ' +quotedstr(ssearch);