Delphi 使用LIKE从SQL获取记录

qq24tv8q  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(174)

我使用了一个var,它根据按下的字母按钮动态添加值。我需要它做的是只获取姓氏以该字母开头的记录。

Var
GetChar : String;
Begin
GetChar := GlobalVarUnit.AlphaValue;
RCMCListBox.Items.Clear;
RootsDB.Connected := True;
UpdateQuery.close;
UpdateQuery.SQL.Clear;
UpdateQuery.sql.text := 'SELECT * FROM Contacts WHERE [PrimaryLastName] LIKE :CFind';
UpdateQuery.ParamCheck := True;
UpdateQuery.ParamByName('CFind').Value := GetChar;
UpdateQuery.open;
UpdateQuery.first;
RCMCListBox.Items.BeginUpdate;

//if GetChar <> '' then

while (not UpdateQuery.eof) and (UpdateQuery.ParamByName('CFind').Value = GetChar) do

begin
RCMCListBox.Items.Add(RCTable.fieldbyname('ContactID').asstring + ';' + RCTable.fieldbyname('CompanyName').asstring + ';'
+ RCTable.fieldbyname('PrimaryFirstName').asstring + ' ' + RCTable.fieldbyname('PrimaryLastName').asstring);
UpdateQuery.next;
RCMCListBox.Items.EndUpdate;
End;
UpdateQuery.Close;
RootsDB.Connected := False;

我花了几个小时寻找一个解决方案,我一直在阅读卡里 Json 关于FireDac的书,我发现的大部分是使用DB组件来实现这一点。我真的希望能够只用SQL语句来实现这一点,我觉得这可以让程序在连接到数据库时获得更多的控制权,以便收集所需的信息,然后在完成后关闭它。
我也看到了一些做以下事情的相互矛盾的方法,我不确定什么是正确的方法。例如:

UpdateQuery.sql.text := 'SELECT * FROM Contacts WHERE [PrimaryLastName] LIKE :CFind';
UpdateQuery.sql.text := 'SELECT * FROM Contacts WHERE (PrimaryLastName) LIKE :CFind';
UpdateQuery.sql.text := 'SELECT * FROM Contacts WHERE PrimaryLastName LIKE :CFind';

我使用的是绝对数据库。
谢谢你的帮助

qlzsbp2j

qlzsbp2j1#

正如@KenWhite在这篇评论中提到的,您的LIKE clause需要使用通配符模式。
此外,您正在使用名为UpdateQuery的组件执行查询,但是从名为RCTable的组件阅读字段值。
另外,while循环不需要检查CFind参数。而且,您误用了BeginUpdate/EndUpdate方法。
试试这个:

var
  GetChar : String;
begin
  GetChar := GlobalVarUnit.AlphaValue;
  RCMCListBox.Items.Clear;
  RootsDB.Connected := True;
  try
    UpdateQuery.Close;
    UpdateQuery.SQL.Text := 'SELECT * FROM Contacts WHERE [PrimaryLastName] LIKE :CFind';
    UpdateQuery.ParamCheck := True;
    UpdateQuery.ParamByName('CFind').Value := GetChar + '%'; // <-- wildcard here
    UpdateQuery.Open;
    try
      UpdateQuery.First;
      RCMCListBox.Items.BeginUpdate;
      try
        while not UpdateQuery.Eof do
        begin 
          RCMCListBox.Items.Add(            
            UpdateQuery.FieldByName('ContactID').AsString + ';' +
            UpdateQuery.FieldByName('CompanyName').AsString + ';' +
            UpdateQuery.FieldByName('PrimaryFirstName').AsString + ' ' +
            UpdateQuery.FieldByName('PrimaryLastName').AsString
          );
          UpdateQuery.Next;
        end;
      finally
        RCMCListBox.Items.EndUpdate;
      end;
    finally
      UpdateQuery.Close;
    end;
  finally
    RootsDB.Connected := False;
  end;

相关问题