Как ключевое слово не работает в TableAdapter - PullRequest
0 голосов
/ 17 декабря 2011

Я использую C # с повторителем данных, привязанным к адаптеру таблицы, чтобы вытащить несколько столбцов из таблицы. У меня есть 3 предложения FillBy на моем адаптере, FillByFirstName, FillByLastName и FillByMRN (номер медицинской карты). Все эти три извлекают данные из таблицы в SQL 2000, называемой клиентами.

Имя 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 записей, которые возвращаются с этим РАБОЧИМ запросом:

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

Хотя это НЕ работает при вызове метода из кода, при редактировании оператора через DataSet Designer, если я щелкну по QUERY BUILDER и протестирую его (он запрашивает параметр), он вернет желаемый набор записей.

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 исправляет одинарные кавычки для двойных одинарных кавычек ДЛЯ меня.

Кроме того, я пробовал передавать% без одинарных кавычек, но это приводит только к синтаксическим ошибкам в табличном адаптере. Я попытался передать двойные кавычки, также с синтаксическими ошибками ... и несколькими другими "это должно не получиться", но почему бы и нет ".

Почти в каждом посте один из этих двух способов демонстрирует работоспособность, но я просто не могу заставить его работать.

Кажется, есть разногласие в том, как табличный адаптер должен представлять sql и как он на самом деле .. особенно, когда построитель запросов показывает успех, используя точно такой же оператор, который не выполняется во время выполнения.

1 Ответ

1 голос
/ 17 декабря 2011

Примечание: я не работал с 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). Таким образом, аргумент может быть дополнен длиной 1024 символа после 2222.

Итак, запрос может стать

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 к запросу должно работать.

...