OracleParameter和DBNull.Value

Vip*_*per 1 c# sql oracle

我们在Oracle数据库中有一个表,其中包含一列类型为Char(3 Byte)的列。
现在,我们使用参数化的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
}
[...]  
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我们肯定有一些包含DBNull的行,
但是您可能会注意到用“ is null”而不是“ = null”编写“ normal” sql的情况

有人可以解释这种行为吗?如何编写需要条件才能检查DBNull的参数化sql?

谢谢

Dav*_*ill 5

Null是没有设置为任何东西的情况,因此使用'= null'不会获得正确的行为。因为null表示没有值,所以说“没有任何值的变量与另一个没有任何值的变量具有相同的值”是没有意义的。如果您没有价值,那么您将无法拥有其他东西的相同价值。

解决此问题的一种方法是创建两个sql语句,一个sql语句接受参数,另一个以“ is null”表示。然后使用“ if”语句选择要使用的语句。

陈述1:

string sql = "select * from TEST_TABLE where COLUMN_1 = :COLUMN_1  
Run Code Online (Sandbox Code Playgroud)

陈述2:

string sql = "select * from TEST_TABLE where COLUMN_1 is null
Run Code Online (Sandbox Code Playgroud)

除非您始终将其与null进行比较。然后,只需使用语句2