2012-02-02 73 views
2

我有問題比較空值與Oracle 11g odp.net驅動程序。它可以與oracle 10g odp.net驅動程序正常工作。如果數據庫中的列爲空,那麼在數據行中它的字符串值爲nullOracle 11g odp.net驅動程序與空值的問題

此代碼失敗:

int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0; 

感謝

+0

怎麼樣了代碼是否失敗? (失敗和不能正常工作的情況稍有不同...) – 2012-02-02 23:21:54

+0

我的意思是行[PARENTID] .ToString =「null」而不是null的值。所以當它試圖解析它爲一個整數。我得到一個異常。 「輸入字符串格式不正確」 – 2012-02-03 16:51:46

+0

「行[PARENTID]」的類型是什麼?如果它是'string'或'object',並且如果值*真的是null *,那麼會拋出一個NullReferenceException(*除非有人在擴展方法中偷窺!)。也許存儲的數據*是字符串「null」? (或者在適配器中有些東西壞了,或者是一個標誌......) – 2012-02-04 00:07:29

回答

1

這裏:

var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){ 
    IsNullable = true, 
}; 

if (string.IsNullOrEmpty(organizationParentId)) { 
    para6.Value = null; 
} else { 
    para6.Value = long.Parse(organizationParentId); 
} 
5

這有什麼做的Oracle11g中。 就像你所說的,而不是真正的空值,它是一個空字符串。 如果從OracleDbType,在OracleDbType和CLR數據類型的空檢查從INullable既繼承所以下面是我的解決方案:

((INullable)rowParamDBType.Value).IsNull

爲了有一個更清潔的解決方案,您可以將其擴展。

如果你的行是一個DbType,你可以檢查param.Value == DbNull.Value。


雖然上面也可以工作,真正解決這個問題是使用OracleDbTypeEx,而不是OracleDbType在你的OracleParameter聲明。 OracleDbTypeEx將返回值爲DBType,因此它將識別DBNull。看下面的示例代碼。

command.Parameters.Add(new OracleParameter 
          { 
           ParameterName = "param_out", 
           OracleDbTypeEx = OracleDbType.Decimal, 
           Direction = ParameterDirection.Output 
          }); 

if (command.Parameters["param_out"].Value != Convert.DBNull) 
{ 
    //your code here 
} 
2

弗洛姆Oracle文檔:

F的值是一個DbType之,你可以檢查param.Value == DbNull.Value

如果該值是OracleDbType,您可以檢查((INullable)param.Value).IsNull,因爲Oracle Types繼承INullable接口。