LIKE关键字在TableAdapter中不起作用

时间:2011-12-17 18:50:07

标签: c# sql sql-like tableadapter

我正在使用带有数据转发器的C#绑定到表适配器以从表中提取几列。我的适配器上有3个FillBy子句,FillByFirstName,FillByLastName和FillByMRN(医疗记录编号)。这三个从SQL 2000中的表中拉出数据称为Clients。

名字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

姓氏QUERY看起来像这样,它也可以按预期工作:

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转换为没有params且具有相同选择标准的实际语句。

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

表适配器查询:

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

虽然从代码调用方法时这不起作用,但是当通过DataSet Designer编辑语句时,如果我单击QUERY BUILDER并测试它(它会提示输入参数),它将返回所需的记录集。 / p>

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正在修复单引号以使单引号为FOR me。

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

在几乎每一篇文章中,这两种方式中的一种被证明是一种有效的方法,但我无法使其发挥作用。

表tableapapter应该如何呈现sql以及它实际上是如何脱节的......尤其是当查询构建器使用在运行时失败的完全相同的语句显示成功时。

1 个答案:

答案 0 :(得分: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添加到查询中应该有效。