【问题标题】:LIKE keyword not working in TableAdapterLIKE 关键字在 TableAdapter 中不起作用
【发布时间】:2011-12-17 18:50:06
【问题描述】:

我正在使用 C# 和一个绑定到表适配器的数据中继器,以从表中提取几列。我的适配器上有 3 个 FillBy 子句,FillByFirstName、FillByLastName 和 FillByMRN(病历编号)。这三个都从 SQL 2000 中名为 Clients 的表中提取数据。

First Name QUERY 看起来像这样,它可以按需要工作:

SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE CL_FName = ? ORDER BY CL_LName, CL_FName

姓氏查询看起来像这样,它也可以按需要工作:

SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE CL_LName = ? ORDER BY CL_LName, CL_FName

MRN QUERY 是它失败的地方,它是不同的,因为它使用 SQL LIKE 语句。

经过大量在线搜索后,我找到了被吹捧为有效但对我来说完全失败的“解决方案”。

我失败的第一个解决方案是:

表适配器查询:

SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE (MED_REC_NO LIKE ?) ORDER BY CL_LName, CL_FName

C#代码:

clientsTableAdapter.FillByMRN(clinicalSystemDataSet.Clients, "%" + searchStr + "%");

这不会返回错误和结果。

当我在 SQL 中跟踪它时,它是这样执行的(我只删除了换行符和一些间距)。

exec sp_executesql N'SELECT        CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM            dbo.Clients WHERE        (MED_REC_NO LIKE @P1) ORDER BY CL_LName, CL_FName', N'@P1 char(1024)', '%2222%'

我删除的间距是...最后一部分中的 %2222% 被填充为 1024 个字符。我不认为这是有问题的,因为没有 like 声明的工作方法也被填充了。如果这是有问题的,我不知道如何更改行为,因为表适配器使用 SQL 在队列中创建此查询。

我无法弄清楚为什么上述方法失败 以这种格式直接在 sql 中执行它会返回一个空记录集,其中我们没有填充空格。我的表中有 11 条记录与此 WORKING 查询一起返回:

SELECT  CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE (MED_REC_NO LIKE '%2222%') ORDER BY CL_LName, CL_FName

...就是上面的 sql trace 转化为没有参数和相同选择标准的实际语句。

对我来说失败的第二个解决方案是:

表适配器查询:

SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE (MED_REC_NO LIKE '%' + ? + '%') ORDER BY CL_LName, CL_FName

虽然这在从代码调用方法时不起作用,但在通过数据集设计器编辑语句时,如果我单击 QUERY BUILDER 并对其进行测试(它会提示输入参数),它将返回所需的记录集。

C#部分:

clientsTableAdapter.FillByMRN(clinicalSystemDataSet.Clients, searchStr);

这将返回 NO 结果,并且 SQL 跟踪显示:

exec sp_executesql N'SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code FROM dbo.Clients WHERE (MED_REC_NO LIKE ''%'' + @P1 + ''%'') ORDER BY CL_LName, CL_FName', N'@P1 char(1024)', '2222'

再次将 2222 填充为 1024 个字符。但是注意sql中的'%'变成了''%''。适配器/SQL 正在为我修复单引号到双单引号。

此外,我尝试在不带单引号的情况下传递 % ,但这只会导致表适配器出现语法错误。我试过传递双引号,也有语法错误.. 和其他一些杂项“这应该失败,但为什么不”类型的东西。

在几乎每篇文章中,这两种方法中的一种都被证明是一种可行的方法,但我就是无法让它发挥作用。

tableadapter 应该如何呈现 sql 和它实际上是如何呈现的似乎存在脱节。尤其是当查询生成器使用在运行时失败的完全相同的语句显示成功时。

【问题讨论】:

  • 你能把 %s 从 TableAdapter 的查询中取出,然后将它们连接到参数上吗?
  • 你也可以用通配符'*'代替'%'

标签: c# sql sql-like tableadapter


【解决方案1】:

注意:我没有使用过 TableAdapter。

但是,我尝试在 SQL Server 中创建一个带有 char(1024) 字段的临时表,并使用了 like 查询。

我的预感是,您必须将 TableAdapter 查询修改为

SELECT CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, RACE_Code 
FROM dbo.Clients WHERE (MED_REC_NO LIKE RTRIM(?)) 
ORDER BY CL_LName, CL_FName

原因(我的猜测)是该字段的数据类型为char(1024)。因此,它可能会填充参数以使其成为 2222 之后的 1024 个字符的长度。

所以,查询可能变成

exec sp_executesql N'SELECT        CL_LName, CL_FName, MED_REC_NO, CL_SEX, CL_DOB, 
RACE_Code FROM            dbo.Clients WHERE        (MED_REC_NO LIKE @P1) ORDER BY 
CL_LName, CL_FName', N'@P1 char(1024)', '%2222........%'

其中......将是空格的填充。因此,该查询可以解释为,获取 MRN 的记录,开始以 2222 并且其余后面是空格,您的表中可能没有匹配的记录。

在我的猜测中,将RTRIM 添加到查询中应该可以。

【讨论】:

  • 谢谢,这确实有道理。唯一的区别是我在数据库中的字段是 varchar(16)。它是表适配器,而不是指定 char(1024) 作为调用中的类型。但是查询中的 RTRIM 可能会这样做。我会尝试更新。谢谢。
  • 这正是我正在寻找的解决方案。不确定为什么它会以这种方式重新定义我在表适配器中的字段,但是在查询中对变量进行 RTRIM 的工作就像一个冠军。谢谢!
猜你喜欢
  • 2015-05-25
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多