DBNull.Value三目运算符,怪怪!!!

时间:2021-09-23 13:59:37
用这个方法就行:
if (txtNnme.Text == string.Empty || txtNnme.Text.Trim() == "")
{
    oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = DBNull.value;
}
else
{
    oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = txtNnme.Text.Trim();
}
用这个方法怎么不行:
oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = (txtNnme.Text==String.Empty?DBNull.Value:txtNnme.Text.Trim());
提示出错:
无法确定条件表达式的类型,因为“System.DBNull”和“string”之间没有隐式转换
???????????????请高手相助

16 个解决方案

#1


(object)System.DBNull

#2


oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = (txtNnme.Text==String.Empty? null :txtNnme.Text.Trim());

#3


OneDotRed(武装到眼神),兄弟,在oracle 不能插入null值!!!
在sql2000里面是可以的。

#4


convert.dbnull

#5


在你的这个表达式里,可能返回一个string,也可能返回DBNull.Value,这两个值的类型跟本不一样.
而?:运算符应返回的数据的类型是一样的.所以有错.
所以,你不能用?:来运算Parameter.Value的值.

而要用你的第一种方式.

#6


TO  OneDotRed(武装到眼神):

要用DBNull.Value怎么用null了,这是两个不同的值啊.

#7


三目运算符里的true part和false part应该类型一致吧!

#8


返回其中一个值: txtNnme.Text==String.Empty?DBNull.Value:txtNnme.Text.Trim())

#9


实现上在你使用?:这个表达式的时候一定要保证你的表示式无论如何要返回一致的数据类型才行.
比如下在的也是不对的:
int v = 0;
object o = (v == 0 ? "0" :v);//有错: 无法确定条件表达式的类型,因为“string”和“int”之间没有隐式转换

这样就是对的:

int v = 0;
object o = (v == 0 ? 1 :v);

#10


txtNnme.Text.Trim()

DBNull.Value

是类型不相同的值,所以就出了编译错误.

#11


理由同上,我没发现
DBNull.Value的返回是什么。

用DBNull.ToString()试试
返回值
空字符串(String.Empty)。

#12


? : 运算返回一个值,
DBNull.Value不是string类型,前后类型不一致,所以出现这种情况,改成这样应该没问题
oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = (txtNnme.Text==String.Empty?(object)DBNull.Value:(object)txtNnme.Text.Trim());

#13


OneDotRed(武装到眼神) 

问题总算可以搞定了
(object)txtNnme.Text.Trim();
加上object 这样写是什么意思?

#14


强制把string类型的值按object类型来传递给object的参数.
这样是可以.

#15


Object 是.Net下的基类,所有类型都是继承Object来的,这样转换的目的是保证前后类型的一致性

#16


高兴,马上结贴!!!

#1


(object)System.DBNull

#2


oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = (txtNnme.Text==String.Empty? null :txtNnme.Text.Trim());

#3


OneDotRed(武装到眼神),兄弟,在oracle 不能插入null值!!!
在sql2000里面是可以的。

#4


convert.dbnull

#5


在你的这个表达式里,可能返回一个string,也可能返回DBNull.Value,这两个值的类型跟本不一样.
而?:运算符应返回的数据的类型是一样的.所以有错.
所以,你不能用?:来运算Parameter.Value的值.

而要用你的第一种方式.

#6


TO  OneDotRed(武装到眼神):

要用DBNull.Value怎么用null了,这是两个不同的值啊.

#7


三目运算符里的true part和false part应该类型一致吧!

#8


返回其中一个值: txtNnme.Text==String.Empty?DBNull.Value:txtNnme.Text.Trim())

#9


实现上在你使用?:这个表达式的时候一定要保证你的表示式无论如何要返回一致的数据类型才行.
比如下在的也是不对的:
int v = 0;
object o = (v == 0 ? "0" :v);//有错: 无法确定条件表达式的类型,因为“string”和“int”之间没有隐式转换

这样就是对的:

int v = 0;
object o = (v == 0 ? 1 :v);

#10


txtNnme.Text.Trim()

DBNull.Value

是类型不相同的值,所以就出了编译错误.

#11


理由同上,我没发现
DBNull.Value的返回是什么。

用DBNull.ToString()试试
返回值
空字符串(String.Empty)。

#12


? : 运算返回一个值,
DBNull.Value不是string类型,前后类型不一致,所以出现这种情况,改成这样应该没问题
oracmd.Parameters.Add("P_TESTNAME", OracleType.VarChar, 100).Value = (txtNnme.Text==String.Empty?(object)DBNull.Value:(object)txtNnme.Text.Trim());

#13


OneDotRed(武装到眼神) 

问题总算可以搞定了
(object)txtNnme.Text.Trim();
加上object 这样写是什么意思?

#14


强制把string类型的值按object类型来传递给object的参数.
这样是可以.

#15


Object 是.Net下的基类,所有类型都是继承Object来的,这样转换的目的是保证前后类型的一致性

#16


高兴,马上结贴!!!