OracleParameter和DBNull.Value

时间:2009-11-09 14:37:41

标签: 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
}
[...]  

我错过了什么吗?我们肯定有一些行包含DBNull,
但是你要写一个'普通'sql的情况是“null”而不是“= null”
也是值得注意的。

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

由于

5 个答案:

答案 0 :(得分:5)

Null是没有被设置为任何东西所以你不会得到'= 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

除非你总是与null比较。然后,只需使用语句2

答案 1 :(得分:2)

在这种情况下,您必须使用IS NULL

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

在SQL中执行与null值的任何比较将始终产生unknown结果,这意味着您将不会返回任何行。

答案 2 :(得分:2)

你可以这样做:

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)

答案 3 :(得分:1)

像这样修改你的代码:

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
}

答案 4 :(得分:0)

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)

这也可以。