我有問題比較空值與Oracle 11g odp.net驅動程序。它可以與oracle 10g odp.net驅動程序正常工作。如果數據庫中的列爲空,那麼在數據行中它的字符串值爲null
。Oracle 11g odp.net驅動程序與空值的問題
此代碼失敗:
int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0;
感謝
我有問題比較空值與Oracle 11g odp.net驅動程序。它可以與oracle 10g odp.net驅動程序正常工作。如果數據庫中的列爲空,那麼在數據行中它的字符串值爲null
。Oracle 11g odp.net驅動程序與空值的問題
此代碼失敗:
int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0;
感謝
這裏:
var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){
IsNullable = true,
};
if (string.IsNullOrEmpty(organizationParentId)) {
para6.Value = null;
} else {
para6.Value = long.Parse(organizationParentId);
}
這有什麼做的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
}
弗洛姆Oracle文檔:
F的值是一個DbType之,你可以檢查param.Value == DbNull.Value
如果該值是OracleDbType,您可以檢查((INullable)param.Value).IsNull,因爲Oracle Types繼承INullable接口。
怎麼樣了代碼是否失敗? (失敗和不能正常工作的情況稍有不同...) – 2012-02-02 23:21:54
我的意思是行[PARENTID] .ToString =「null」而不是null的值。所以當它試圖解析它爲一個整數。我得到一個異常。 「輸入字符串格式不正確」 – 2012-02-03 16:51:46
「行[PARENTID]」的類型是什麼?如果它是'string'或'object',並且如果值*真的是null *,那麼會拋出一個NullReferenceException(*除非有人在擴展方法中偷窺!)。也許存儲的數據*是字符串「null」? (或者在適配器中有些東西壞了,或者是一個標誌......) – 2012-02-04 00:07:29