2017-02-10 9 views
1

Я пытаюсь использовать Npgsql для запроса строк со значением NULL, и с помощью простого запроса он работает, но это ошибка, если я использую подготовленный оператор.Npgsql выдает ошибку, если параметр появляется после IS

Например, этот запрос будет работать:

SELECT * FROM table WHERE column IS NULL LIMIT 10; 

Но это не будет:

// @null is a parameter with a null value (DBNull.Value) 
SELECT * FROM table WHERE column IS @null LIMIT 10; 

Этот запрос вернет пустой результирующий набор, но без ошибок, которые, как ожидается:

// @null is a parameter with a null value (DBNull.Value) 
SELECT * FROM table WHERE column = @null LIMIT 10; 

Я также попытался использовать IS для логического значения, и снова он вел себя так, как ожидалось, используя =, но thre w ошибка в IS. Я что-то делаю неправильно или это ошибка?

Стек след Информация/ошибка:

Npgsql.PostgresException -- External component has thrown an exception. 
at Npgsql.NpgsqlConnector.DoReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage, Boolean isPrependedMessage) 
at Npgsql.NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage) 
at Npgsql.NpgsqlCommand.Prepare() 

Все тесты были проведены с использованием версии 3.0.4 первоначально, а также 3.1.9.

+0

Только один не имеет смысла? – Steve

+0

= само по себе тоже бессмысленно. = \ @param - нет. IS \ @param тоже нет. –

+0

Я имею в виду. IS NULL - это целое утверждение как «ЛОЖЬ» или «ИСТИНА». Вы не можете разделиться и использовать только часть IS и вставить параметр для завершения инструкции. – Steve

ответ

0

Как уже упоминалось в комментариях IS и IS NOT - это не термины, которые могут использоваться в одиночку. Они являются частями большего заявления: IS NULL или IS NOT NULL, которые нельзя разбить.