【发布时间】: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