gpt4 book ai didi

sql-server - 为什么带有日期/时间值的 TADOTable 中的 Locate() 不起作用

转载 作者:行者123 更新时间:2023-12-03 19:47:42 24 4
gpt4 key购买 nike

我正在开发一个用于记录用户事件的小型子系统。系统使用MS SQL Server作为数据库,使用Delphi7和ADO构建接口(interface)。
我遇到的问题是我无法找到具有特定 datetime 的记录值(value)。
以下是该问题的示例重现:
1.数据库 :MS SQL Server 2005 速成版。

-- Table creation
CREATE TABLE [tlog] (
[USERN] [numeric](10, 0) NULL,
[USERDATE] [datetime] NULL,
[LOGTEXT] [varchar](250) COLLATE Cyrillic_General_CS_AS NULL
);

-- Insert date/time value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, CURRENT_TIMESTAMP, 'Record current activity')
-- Insert date only value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, '20180202', 'Record current activity')

-- Table's content
-------------------------------------------------------------
| USERN | USERDATE | LOGTEXT |
-------------------------------------------------------------
| 1 | 26/10/2015 17:13:36.597 | Record current activity |
-------------------------------------------------------------
| 1 | 02/02/2018 00:00:00.000 | Record current activity |
-------------------------------------------------------------
2. 示例代码:德尔福 7 和 ADO
procedure TfrmMain.btnLocateClick(Sender: TObject);
var
d: TDateTime;
tblLog: TADOTable;
begin
//
ThousandSeparator := ' ';
DecimalSeparator := '.';
DateSeparator := '/';
ShortDateFormat := 'dd/mm/yyyy';
LongDateFormat := 'dd/mm/yyyy';
TimeSeparator := ':';
ShortTimeFormat := 'hh:mm';
LongTimeFormat := 'hh:mm';
TwoDigitYearCenturyWindow := 50;
ListSeparator := ';';

//
tblLog := TADOTable.Create(Application);
try

//
tblLog.ConnectionString :=
'Provider=SQLOLEDB.1;'+
'Password=xxxx;'+
'Persist Security Info=True;'+
'User ID=xxxxxxxx;'+
'Initial Catalog=xxxxxxxxx;'+
'Data Source=127.0.0.1\xxxxxxx,1066';
tblLog.TableName := '[tlog]';
tblLog.Open;

// First try - locate with exact value. NOT WORKING.
d := StrToDateTime('26/10/2015 17:13:36.597');
if tblLog.Locate('USERDATE', d, []) then
ShowMessage('Exact value, no Locate options: Located')
else
ShowMessage('Exact value, no Locate options: Not located');
if tblLog.Locate('USERDATE', d, [loPartialKey]) then
ShowMessage('Exact value, with Locate options: Located')
else
ShowMessage('Exact value, with Locate options: Not located');

// Second try - locate with value that matches format settings. NOT WORKING.
d := StrToDateTime('26/10/2015 17:13');
if tblLog.Locate('USERDATE', d, []) then
ShowMessage('Hours and minutes, no Locate options: Located')
else
ShowMessage('Hours and minutes, no Locate options: Not located');
if tblLog.Locate('USERDATE', d, [loPartialKey]) then
ShowMessage('Hours and minutes, with Locate options: Located')
else
ShowMessage('Hours and minutes, with Locate options: Not located');

// Locate with date only value. WORKING.
d := StrToDateTime('02/02/2018');
if tblLog.Locate('USERDATE', d, []) then
ShowMessage('Located')
else
ShowMessage('Not located');

finally
//
tblLog.Close;
tblLog.Free;
end;
end;
3. 预期结果:找到记录。
4.实际结果: TADOTable.Locate()返回 false .
我做错了什么以及如何通过 datetime值为 TADOTable.Locate()方法?
提前致谢!

最佳答案

您使用过Locate几乎正确。差不多,因为loPartialKey在搜索 时,您包含的选项毫无意义日期时间 值(value)观。在这种情况下,您需要搜索确切的日期时间值。问题出在您的测试中。

您的第一个测试有错误的日期时间值。它的毫秒部分在您的转换中被忽略,因此您实际上是在尝试定位日期时间 26/10/2015 17:13:36 这不在你的 table 上。

在第二种情况下,您试图定位日期时间 26/10/2015 17:13 这不在你的 table 上。

我建议使用例如EncodeDateTime用于构建日期时间而不是字符串转换并使用 loPartialKey 删除那些额外调用的函数选项。

关于sql-server - 为什么带有日期/时间值的 TADOTable 中的 Locate() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com