LIKE关键字在TableAdapter中不工作
本文关键字:工作 TableAdapter 关键字 LIKE | 更新日期: 2023-09-27 18:18:04
我正在使用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
Last Name 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个字符。我不认为这是有问题的,因为没有类似声明的工作方法也被填充了。如果这是一个问题,我不知道如何改变行为,因为表适配器创建这个查询队列与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跟踪转换为没有参数且具有相同选择标准的实际语句。
第二个对我来说失败的解决方案是:
表适配器查询:
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正在为我修复单引号到双单引号。
另外,我试过传递不带单引号的%,但它只会导致表适配器中的语法错误。我试过传递双引号,语法错误也是…还有其他一些"this should fail, but why not"之类的东西。
在几乎每一篇文章中,这两种方法中的一种都被证明是有效的方法,但我就是不能让它起作用。
似乎有一个断开在如何tableadapter应该呈现sql和它实际上是如何…特别是当查询生成器使用在运行时失败的完全相同的语句显示成功时。
注意:我还没有使用过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开始, rest后跟空格,在您的表中可能没有匹配的记录。
在我的猜测,添加RTRIM
到查询应该工作。