0

我有一个 MS SQL Server 2019 表,其中有一个名为“Char”的列,它被定义为 nvarchar(4)。

在我的示例 Delphi 10.3.3 代码中,我有一行说:

 found := ADODataSet1.Locate('Char', '⓪', []);

表中没有具有这样值的记录,但是当我执行代码时,Locate 返回 True 并定位到结果集中的第一条记录。如果我添加具有该值的记录,Locate 仍然返回 True,但定位到结果集中的第一条记录,而不是具有所需字符的记录。

使用 ASCII 字符,代码按预期工作。

更新:

我表中的第一条记录在 Char 列中有“0”。如果我删除它,那么定位“⓪”返回 False。如果我添加“⓪” 到表然后定位找到那个,但如果同时包含“⓪”和“0”,那么它会找到ASCII数字。如果我尝试定位“②”,它会返回包含“2”的记录。顺便说一下,Char 列是表上的唯一索引。

重现问题的步骤。

  1. SQL Server 2019,默认美国安装

  2. 创建表

    创建表 [dbo].[Things]( [Thing] nvarchar NOT NULL ) ON [PRIMARY]

我用 TADODataSet、TMemo 和 TButton 创建了一个 VCL 应用程序

这是按钮的代码:

procedure TForm2.Button1Click(Sender: TObject);
{} procedure Add2Table(aString: string);
begin
  with ADODataSet1 do begin
    Insert;
    FieldByName('Thing').AsString := aString;
    Post;
    Memo1.Lines.Add('Added: ' + aString);
  end;
end;

const
  cTarget = '①';
begin
  with ADODataSet1 do begin
    Close;
    CommandText := 'Select * from Things';
    Open;
    Memo1.Clear;
    Memo1.Lines.Add('RecordCount ' + IntToStr(RecordCount));
    Add2Table('0');
    Add2Table('1');
    Add2Table('2');
    Add2Table('⓪');
    Add2Table(cTarget);
    Add2Table('②');

    Close; Open;
    Memo1.Lines.Add('Trying to locate: ' +  cTarget);
    if Locate('Thing', cTarget, []) then
      Memo1.Lines.Add(Format('Found %s in record %d', [
        FieldByName('Thing').AsString, Recno]))
    else
      Memo1.Lines.Add('Not found');
  end;
end;

当程序运行时,它没有找到目标字符“①”,而是找到了“1”。

4

0 回答 0