我们在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?
谢谢
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
| 归档时间: |
|
| 查看次数: |
5966 次 |
| 最近记录: |