2016-05-27 4 views
2

Прежде чем кто замечает, что это есть ответ на другой вопрос, я знаю that..but, несмотря на ответы, которые я рассмотрели наКак передать нулевое значение в качестве параметра для SqlCommand

и даже мой собственный вопрос в

Я не могу получить мой запрос, возвращающий значения с нулевыми параметрами

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

Я также попытался это с

int? i = null; 

SqlConnection connection = new SqlConnection(Properties.Settings.Default.connstring.ToString()); 

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = connection; 
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk"; 
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull); 

cmd.Connection.Open(); 

var dataReader = cmd.ExecuteReader(); 
var dataTable = new DataTable(); 
dataTable.Load(dataReader); 

cmd.Connection.Close(); 

Я попытался вариации на это, где я только что сделал

cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value); 

И я попытался с помощью запроса

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null"; 

Я пытался явно объявляя параметр как обнуляемый

Что по какой-то причине я думал, что у меня есть работа, поэтому я решил принять ответ, но я ошибся, что возвращает все ко мне, независимо от того, какая ценность.

Я знаю, что объект команды соединяет и возвращает данные, потому что, если я помещаю в допустимое значение (скажем, 27), он возвращает запись ... Я также знаю, что есть записи с нулевым значением ... но нет вопрос, как я пытаюсь настроить его, я все равно ничего не получаю, когда пытаюсь передать значение null в качестве параметра.

Любой, кто может помочь мне выяснить, что я делаю неправильно здесь, я был бы признателен.

+1

при использовании SQL Profiler, чтобы посмотреть на то, что на самом деле отправляется в SQL Server, какие значение передается вместо Null? – PhillipH

+0

Есть ли причина, по которой вы не переходите к хранимой процедуре, но пишите простые запросы внутри Visual Studio? Я также проголосую за идею @ PhillipH по SQL Profiler. – techspider

+1

Если я правильно понял, вам нужно: «parent_pk = @parent_pk или (@parent_pk IS NULL AND parent_pk IS NULL)» – Evk

ответ

6

Поскольку мое решение от комментариев работало - опубликуйте его здесь. В основном проблема, как уже описано (и даже уже ответила на ваш предыдущий вопрос), заключается в том, что вам нужно использовать IS NULL для сравнения значений с нулем в sql. Так как вы можете иметь два случая (ваш параметр является нулевым или нет) - вы должны проверить для обоих условий, как это:

where parent_pk = @parent_pk or (@parent_pk IS NULL and parent_pk IS NULL) 
+0

Я спрашиваю, почему я этого не знал. Существуют ли альтернативы этому подходу? – Kr15

+0

@ Kr15 Вы можете использовать «set ansi_nulls off», чтобы изменить, как работают операторы равенства с нулевыми значениями, обычно не рекомендую. По стандарту ISO sql сравнение двух нулевых значений не определено (null = null не является ни истинным, ни ложным), и есть причина, почему это так, поэтому вам лучше просто жить с этим :) – Evk

+0

О, хорошо, thx. Но, может быть, вы также можете объяснить причину, по которой null == null? не следует считать истинным, пожалуйста. – Kr15

4

Проблема заключается в выборе запросов SQL:

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";

если @parent_pk имеет значение NULL, он не будет возвращать ничего, так как даже если parent_pk является недействительным в SQL Server NULL = NULL возвращают ложь. NULL is NULL return true.

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null"; 

Этот запрос возвращает все, потому что, если вы проходите через NULL для @parent_pk то пункт @parent_pk is NULL будет оценивать справедливо, поскольку @parent_pk не изменяется для каждой строки вычисляется.

Чтобы сделать то, что вы пытаетесь сделать, вы должны сделать что-то вроде:

string nullCommandText = "Select * from view_nests where parent_pk IS @parent_pk"; 
string commandText = "Select * from view_nests where parent_pk = @parent_pk"; 
cmd.CommandText = i == null? nullCommandText : commandText; 
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull); 

Две другие комментарии:

  1. Не следует использовать *, список столбцов, которые вы хотите.
  2. Если вам нужно сделать такую ​​логику, создайте хранимую процедуру на стороне db и используйте ее вместо этого.
Смежные вопросы