1

请协助,

每当我使用类似于以下的代码将值传递给参数时,我都会收到此错误:

parameters.paramByName('ParamVal1').value := trim(TextBox1.Text);
parameters.paramByName('ParamVal2').value := trim(TextBox2.Text);

因此,如果其中一个文本框为空白,则错误:

数据类型 varchar 和 text 在大于等于运算符中不兼容

出现。

有什么问题?


按照以下建议运行 sqlprofiler 后

exec sp_executesql N'Select * from BLOtherChargeDetails 

where Field1 = @P1 and Field2 >= @P2 and Field2 <= @P3 and
Field3 >= @P4 and Field3 <= @P5 and
Field4 >= @P6 and Field4 <= @P7 and 
Field5 = @P8

Order By Field2, Field3
',N'@P1 varchar(50),@P2 text,@P3 varchar(5),@P4 text,@P5 varchar(5),@P6 varchar(8),@P7 varchar(8),@P8 smallint','Value_P1','','ZZZZZ','','ZZZZZ','20130401','20130611',0
go
4

3 回答 3

1

终于让它工作了;

出于某种奇怪的原因,一些带有参数的选择查询总是给出错误,尽管语句是正确的。

在设计时进行测试,出现错误“Invalid Parameter”。

修复:

  1. 删除参数 {在设计时} 即具有

    “其中 field1 = :parameter1 和 field2 >= :parameter2”

    然后通过将活动状态更改为活动来激活 TADOQuery。

  2. 返回参数{在设计时},然后再次激活 TADOQuery。

尝试在运行时运行查询,这一次它应该可以工作。

于 2013-06-12T08:32:15.460 回答
1

这与其说是 Delphi 的限制,不如说是 SQL Server 的限制。

你正在做的是链接这个:

select Expression 
from YourTable
where YourTable.TextColum = 'VarCharLiteral'

但使用参数:

select Expression 
from YourTable
where YourTable.TextColum = :VarCharParameter

对于字符文字和字符参数,SQL Server 将选择 VARCHAR 或 NVARCHAR 作为数据类型。

SQL Server 不允许您有 TEXT 或 NTEXT 参数,因此字符文字或字符参数将获得 VARCHAR 或 NVARCHAR 的数据类型。

有两种变通方法,改编自SQL SERVER – Fix: Error : 402 The data types ntext and varchar are in compatible in the equal to operator

  • 远离 TEXT 列。

这是首选方式,因为 TEXT 和 NTEXT 已被弃用一段时间,请参阅nvarchar(max) vs NText

为此,您必须像这样更改您的表格:

alter table YourTable
alter column TextColum NVARCHAR(MAX)
  • 将您的 TEXT 列转换为 VARCHAR

这是最容易上手的,也是一个短期的解决方案。

select Expression 
from YourTable
where convert(NVARCHAR(MAX), YourTable.TextColum) = :VarCharParameter
于 2013-06-08T07:49:52.793 回答
0

数据类型 varchar 和 text 不兼容

刚刚使用ftString遇到了这个问题。将参数类型更改为ftFixedChar,大小为 50(我的大小要求),此后一切正常。

编辑

我修改了查询以指定在查询表达式中使用的变量而不是参数:

DECLARE @MyVar nvarchar(50)
SET @MyVar = :MyDelphiVal

SELECT ...
WHERE mycol LIKE ISNULL(@MyVar, N'') + '%'

它允许ftString参数类型。

顺便说一句,德尔福 2010,SQL2008 R2,ADO

于 2013-12-05T05:31:27.013 回答