Date Firebird SQL:错误代码-104,令牌未知
我有一个脚本,在下面的Ostendo(一个ERP)中,它运行在firebird数据库上。 脚本是用Pascal编写的。它在TMPQuery2.ExecQuery行返回一个错误“Firebird SQL:错误代码-104,未知标记,'13/04/2018'。我删除了引用文本DATEWORKED={ds'13/04/2018'},并且工作正常。我已经注释掉了我试图解决它的所有其他行,但没有任何行起作用 关于我哪里出了问题,有什么想法吗?我觉得这与日期格式有关。我试过dd-mm-yyyy,yyy-mm-dd(这是通过excel从OBDC中工作的方式),dd/mm/yyyy(这是在ostendo中显示的方式)Date Firebird SQL:错误代码-104,令牌未知,date,firebird,Date,Firebird,我有一个脚本,在下面的Ostendo(一个ERP)中,它运行在firebird数据库上。 脚本是用Pascal编写的。它在TMPQuery2.ExecQuery行返回一个错误“Firebird SQL:错误代码-104,未知标记,'13/04/2018'。我删除了引用文本DATEWORKED={ds'13/04/2018'},并且工作正常。我已经注释掉了我试图解决它的所有其他行,但没有任何行起作用 关于我哪里出了问题,有什么想法吗?我觉得这与日期格式有关。我试过dd-mm-yyyy,yyy-mm
您是从哪里想到Firebird中的日期文字是以类似于
{ds'2018-04-13'}
的格式表示的?将字符串数据类型转换为日期的合法格式列在“”一章的“文字格式”部分
基本上,yyyy-mm-dd
格式是正确的,但在用pascal连接字符串时,它必须是一个简单的字符串,即DATEWORKED='''+TSDateWorked+'
但不应将查询构建为字符串,而应使用参数化查询。SQL字符串中的参数通常由名称表示,名称前面有冒号,即:DateWorked
。因此,您的查询如下所示:
SQLStr := 'SELECT TIMESHEETBATCHNO FROM TIMESHEETLINES WHERE DATEWORKED = :DateWorked AND EMPLOYEENAME = :employee';
...
TMPQuery2.Params[0].AsDateTime := strtodate(SSGetCellText(0,x));
TMPQuery2.Params[1].AsString := 'DE BEER';
TMPQuery2.ExecQuery;
查询组件通常还具有ParamByName
方法,因此可以使用名称来指定值,而不是参数位置。
我不知道
TpFIBQuery
组件,因此属性/方法名称可能不同,请咨询该组件的帮助。您从哪里了解到Firebird中的日期文字是以类似{ds'2018-04-13'}
的格式表示的?将字符串数据类型转换为日期的合法格式列在“文字格式”中第“”章中的“”节
基本上,yyyy-mm-dd
格式是正确的,但在用pascal连接字符串时,它必须是一个简单的字符串,即DATEWORKED='''+TSDateWorked+'
但不应将查询构建为字符串,而应使用参数化查询。SQL字符串中的参数通常由前面有冒号的名称表示,即:DateWorked
。所以您的查询看起来像
SQLStr := 'SELECT TIMESHEETBATCHNO FROM TIMESHEETLINES WHERE DATEWORKED = :DateWorked AND EMPLOYEENAME = :employee';
...
TMPQuery2.Params[0].AsDateTime := strtodate(SSGetCellText(0,x));
TMPQuery2.Params[1].AsString := 'DE BEER';
TMPQuery2.ExecQuery;
查询组件通常还具有ParamByName
方法,因此可以使用名称来指定值,而不是参数位置。
我不知道
TpFIBQuery
组件,因此属性/方法名称可能不同,请咨询该组件的帮助。{ds'2018-04-13'}
看起来像ODBC或JDBC转义(除非它是{d'2018-04-13'}
,而不是ds
)。请参阅{ds'2018-04-13'}
看起来像ODBC或JDBC转义(除非它是{d'2018-04-13'}
,而不是ds
)。看看什么是{ds'13/04/2018'}
,为什么你认为它是正确的?ds代表日期戳。还有表示时间戳的ts。我认为在使用同时包含日期和时间的字段时,这可能是必要的。但这似乎只是在Excel中使用ODBC连接时才需要的。我只知道日期是{d..}
,时间是{t..}
,时间戳是{ts..}
,然后只使用yyyy-MM-dd。这些转义是ODBC和JDBC特有的。据我所知,Delphi不支持这些,Firebird本身也绝对不支持。什么是{ds'13/04/2018'}
,为什么你认为它是正确的?ds代表日期戳。还有表示时间戳的ts。我认为在使用同时包含日期和时间的字段时,这可能是必要的。但这似乎只是在Excel中使用ODBC连接时才需要的。我只知道日期是{d..}
,时间是{t..}
,时间戳是{ts..}
,然后只使用yyyy-MM-dd。这些转义是ODBC和JDBC特有的。据我所知,Delphi不支持这些,Firebird本身也绝对不支持它们。