首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索打开的客户案例,如果未找到打开的案例,则自动显示已关闭的案例

搜索打开的客户案例,如果未找到打开的案例,则自动显示已关闭的案例
EN

Stack Overflow用户
提问于 2016-07-19 23:34:18
回答 1查看 95关注 0票数 0

寻找解决方案的SQL新手。我们有一个客户端数据库,其中一个字段称为CLOSED。如果它包含一个值,则它已关闭,否则为空。在搜索过程中不会显示已关闭的案例,除非我运行单独的查询来显示它们。因此,当我运行搜索但没有显示任何内容时,我会在DELPHI应用程序上选择另一个按钮来显示已结案案例。我希望一个按钮选项能够搜索一个案例,如果没有找到,自动继续或重复搜索,以显示已结案的案例。不确定执行此操作的SQL查询是什么。但是我相信我在正确的地方提前拿到了answer......Thanks……

EN

回答 1

Stack Overflow用户

发布于 2016-07-20 01:15:28

一种方法是在您的Delphi应用程序中创建一条SQL语句并将其发送到服务器。如果我正确理解了您的需求,那么只需要一条SQL语句,即使有两种情况需要考虑: a)所有客户端都关闭,b)一些客户端不关闭。但是,当您在Delphi应用程序中构造SQL时,您需要意识到Sql Injection的风险-请参阅https://en.wikipedia.org/wiki/SQL_injection

一种更好的方法是在服务器上定义一个Stored Procedure来检索所需的数据行。例如,在MS Sql Server中,可以创建如下所示的Stored Procedure

代码语言:javascript
复制
create procedure GetClients as
  if (select count(*) from Clients where Closed is Null) > 0
    select * from Clients where Closed is Null
  else
    select * from Clients

基本上,if ...条件询问是否有任何行的关闭id为空。如果有,则第一个select ...语句返回它们;如果没有,则返回所有行。

您可以从Delphi应用程序执行它,如下所示

代码语言:javascript
复制
type
  TForm1 = class(TForm)
    ADOStoredProc1: TADOStoredProc;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    procedure FormCreate(Sender: TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdoStoredProc1.ProcedureName := 'GetClients;1';
  AdoStoredProc1.Open;
end;

(顺便说一句,要实现这一点,您需要在对象检查器中为AdoStoredProc1设置一个合适的ConnectionString。

请注意,此示例应用程序不会在Delphi应用程序中构造any SQL,因此不存在Sql Injection的风险。

您没有说明您关闭的列是什么数据类型。为了进行测试,我假设它是一个整型列,但任何其他类型都可以。

上面的应用程序特意是极简主义的,基本上是为了说明你可以在服务器端代码中做这样的事情。在实践中,您可能需要对Stored Proc进行参数化,以便可以根据其他列值限制结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38462889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档