我编写了一个通用方法来从数据库(MSSQL Server)中检索单个值。
我遇到了一个案例,我需要从数据库中获取Boolean
值。为什么编译器将它设置为False时将System.Object视为null为什么编译器将它设置为False
正如您在下面的代码中看到的,Object
本地字段(IsExist
)会得到结果。
当DB值为False GenericScalar()
方法返回False(因为它应该) 和条件:if (IsExist == null)
在GetWanLineDisconnectionData()
的真实,返回块被执行,即使是ISEXIST虚假和不为空。
这是为什么?
我该如何克服这个问题?
private void GetWanLineDisconnectionData()
{
string q = "SELECT WanLineDiscconection FROM AdditionalProjectsData WHERE SpCall= " + "'" + spCall + "'";
object IsExist = Orange.ProjectManagment.DAL.Database.GenericScalar<object>(q);
if (IsExist == null) {
return;
}
if (bool.Parse(IsExist) == true) {
RadWanDiscYes.Checked = true;
} else {
RadWanDiscNo.Checked = true;
}
}
数据库的方法:
public static T GenericScalar<T>(string query)
{
OleDbConnection connection = new OleDbConnection(sqlConnString);
connection.Open();
OleDbCommand cmd = new OleDbCommand(query, connection);
try
{
var result = cmd.ExecuteScalar();
if (result == null)
{
return default(T);
}
else
{
return (T)result;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
CloseConnection(ref connection);
}
}
编辑:
也许几个屏幕芽将更好地展示它: (注意:GetWanLineDisconnectionData()
是写在VB.NET和GenericScalar()
写在C#在解决方案中的另一个项目中):
- in beginn ing
IsExist
是空(null)。 该查询找到一行,并且bool列WanLineDiscconection的值为false,并且
IsExist
设置为false,因为它应该是。
它的空值为无值,但DBNull.Value为数据库空的btw。 –
请使用'使用'块,您的片段是一个教材如何通过尝试自己做它搞砸了样本。不要'抛出;'。只能使用'throw;',另一种方法会扰乱堆栈跟踪。 – nvoigt
“WanLineDiscconection”的类型是什么? – HimBromBeere