我们在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?
由于
答案 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)
这也可以。