【发布时间】:2018-01-09 19:49:05
【问题描述】:
我编写了一个通用方法来从数据库 (MSSQL Server) 中检索单个值。
我遇到了一个需要从 DB 中获取 Boolean 值的案例。
正如您在下面的代码中看到的,Object 本地字段 (IsExist) 会得到结果。
当 DB 中的值为 False 时,GenericScalar() 方法返回 False(应该如此)
并且条件:GetWanLineDisconnectionData() 中的 if (IsExist == null) 为真,并且正在执行返回块,即使 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# 编写的):
【问题讨论】:
-
它的 null 表示没有值,但 DBNull.Value 表示 db NULL btw。
-
请使用
using块,您的sn-p 是教科书示例,说明如何自己动手搞砸。不要throw ex;。仅使用throw;,替代方案会破坏堆栈跟踪。 -
WanLineDiscconection的类型是什么? -
@nvoigt 是的,但在这种情况下,最好完全省略 catch 块,因为它没有任何功能(除了破坏堆栈跟踪)。
-
@HimBromBeere 它的布尔值