OracleParameter и DBNull.Value - PullRequest
       19

OracleParameter и DBNull.Value

1 голос
/ 09 ноября 2009

у нас есть таблица в базе данных Oracle, которая содержит столбец с типом Char (3 байта).
Теперь мы используем параметризованный sql, чтобы выбрать несколько строк с DBNull.Value, и это не работает:

OracleCommand command = null;  
OracleDataReader dataReader = null;  

string sql = "select * from TEST_TABLE where COLUMN_1 = :COLUMN_1";  

try  
{  
    OracleConnection connection = (OracleConnection) dbConnection;  
    command = new OracleCommand( sql, connection );  

    OracleParameter param_1 = new OracleParameter( "COLUMN_1", OracleDbType.Char );  
    command.Parameters.Add( param_1 );

    param_1.Value = DbNull.Value;

    dataReader = command.ExecuteReader( );

    int recordCount = 0;
    while( dataReader.Read( ) == true )
    {
        recordCount++;
    }

    Console.WriteLine( "Count = " + recordCount ); // is 0
}
[...]  

Я что-то пропустил? У нас определенно есть несколько строк, которые содержат DBNull,
но то обстоятельство, что вы написали бы «обычный» sql с «является нулевым», а не «= нулевым»
также заметно.

Может кто-нибудь объяснить это поведение? Как вы пишете параметризованный SQL, где вам нужно условие для проверки для DBNull?

Спасибо

Ответы [ 5 ]

5 голосов
/ 09 ноября 2009

Null - это отсутствие установки на что-либо, поэтому вы не получите правильного поведения с '= null'. Поскольку нулевое значение - это отсутствие значения, не имеет смысла говорить: «Эта переменная, в которой отсутствует какое-либо значение, имеет то же значение, что и другая переменная, в которой отсутствует какое-либо значение». Вы не можете иметь то же значение чего-то другого, если у вас нет значения.

Один из способов обойти это - создать два оператора sql, один из которых принимает параметр, а другой с помощью 'is null'. Затем используйте оператор if, чтобы выбрать, какой из них использовать.

оператор 1:

string sql = "select * from TEST_TABLE where COLUMN_1 = :COLUMN_1  

заявление 2:

string sql = "select * from TEST_TABLE where COLUMN_1 is null

Это если вы не всегда сравниваете с нулем. Тогда просто используйте утверждение 2

2 голосов
/ 09 ноября 2009

вы можете сделать это:

select *
from   TEST_TABLE
where  (COLUMN_1 = :COLUMN_1 and :COLUMN_1 Is Not Null) Or 
       (COLUMN_1 Is Null     and :COLUMN_1 Is Null)
2 голосов
/ 09 ноября 2009

В этой ситуации вы должны использовать IS NULL:

string sql = "select * from TEST_TABLE where COLUMN_1 is null";

Выполнение любого сравнения с нулевым значением в SQL всегда приведет к неизвестному результату, что означает, что вы не получите никаких возвращаемых строк.

1 голос
/ 09 ноября 2009

Измените ваш код следующим образом:

OracleCommand command = null;  
OracleDataReader dataReader = null;  

string sql = "select * from TEST_TABLE where COLUMN_1 IS NULL"

try  
{  
    OracleConnection connection = (OracleConnection) dbConnection;  
    command = new OracleCommand( sql, connection );  

    dataReader = command.ExecuteReader( );

    int recordCount = 0;
    while( dataReader.Read( ) == true )
    {
        recordCount++;
    }

    Console.WriteLine( "Count = " + recordCount ); // is 0
}
0 голосов
/ 10 ноября 2009
SELECT t1.*
  FROM t1, (SELECT :s v FROM dual) tmp
 WHERE t1.s = tmp.v OR (t1.s IS NULL AND tmp.v IS NULL)

Это также сделало бы это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...