2011-05-09 72 views
13

在C#中,使用SqlDataReader,有没有办法从数据库读取布尔值?从数据库读取布尔值?

while (reader.Read()) 
{ 
    destPath = reader["destination_path"].ToString(); 
    destFile = reader["destination_file"].ToString(); 
    createDir = reader["create_directory"].ToString(); 
    deleteExisting = Convert.ToBoolean(reader["delete_existing"]); 
    skipIFolderDate = reader["skipifolderdate"].ToString(); 
    useTempFile = reader["useTempFile"].ToString(); 
    password = reader["password"].ToString(); 
} 

在上面的代码中,delete_existing在数据库中始终为1或0。我在MSDN上读到Convert.ToBoolean()不接受1或0作为有效输入。它只接受真或假。有没有另一种方法将DB值转换为bool?或者我需要在SqlDataReader之外执行此操作吗?

另外,我无法更改DB值,因此请不要回答说:“将DB值从1和0改为true和false”。

谢谢!

回答

34

如果delete_existing类型是SQLSERVER '位' 类型,你可以这样做:

var i = reader.GetOrdinal("delete_existing"); // Get the field position 
deleteExisting = reader.GetBoolean(i); 

或(但它会崩溃,如果delete_existing可以DBNull

deleteExisting = (bool)reader["delete_existing"]; 

或更好,这一个下面是DBNull证明并返回如果列是DBNull

deleteExisting = reader["delete_existing"] as bool? ?? false; 

否则,如果数据库类型是int

deleteExisting = (reader["delete_existing"] as int? == 1) ? true : false; 

,或者如果它是一个varchar

deleteExisting = (reader["delete_existing"] as string == "1") ? true : false; 
+0

@Laurent嗯...我宁愿选择第三种选择,因为有人可以在桌子上添加一列,然后很明显,应用程序会崩溃。但是,你能解释第二个选项到底发生了什么吗?我被“作为布尔?错误的”弄糊涂了。“特别是3?的... – 2011-05-09 19:56:57

+0

第三种解决方案:我试图将读者[“delete_existing”]投给一个可为空的bool(bool?)。这样,如果字段包含DBNull.Value,则强制转换将失败并返回null。因为我宁愿变得错误,我正在使用?它将null转换为任何值(即:null ?? 45 = 45)。我使用了很多。 – Larry 2011-05-09 20:02:51

+0

第二种解决方案:我正在对bool进行直接投射。如果该值不是布尔类型,这个将会抛出异常。例如,如果它是DBNull.Value。这就是为什么它应该与非空位数据库字段一起使用。只需选择一个适合您的需求^^ delete_existing btw的数据库类型是什么? – Larry 2011-05-09 20:08:13

-1
deleteExisting = reader.GetBoolean(reader["delete_existing"]); 
+0

这个语句返回一个错误。我认为这是因为GetBoolean函数希望传入一个Int,并且reader [“delete_existing”]不是int ... – 2011-05-09 19:59:18

+0

尝试转换它吗?它应该自动转换为一个int我相信,但你可以尝试明确做reader.GetBoolean((int)reader [“delete_existing”]); – slandau 2011-05-09 20:00:41

+0

对不起,在GetBoolean(x)中,x不是要转换为bool的值,而是一个整数,它是要在数据读取器中读取的字段的位置。 – Larry 2011-05-09 20:04:00

3

铸造工程: myVar的=(布尔)的DataReader [ “myColumn”] ;

+4

如果返回的值实际上是有点的话,那就行了。如果某人懒惰地选择了1或0作为整数,那么投射将失败。 – canon 2011-05-09 20:00:08

1

这个怎么样?

deleteExisting = (reader["delete_existing"] as int?) == 1; 

布尔可能是一些easist类型转换的东西。这里的“Y”,“N”版本:

deleteExisting = string.Equals(reader["delete_existing"] as string, "Y", StringComparision.OrdinalIgnoreCase); 
+0

这是一个不错的 – Larry 2011-05-09 20:20:27

1

如果您正在使用SELECT CASE,并希望使用GetBoolean然后使用CAST阅读前更改列位。

对于如:

SELECT CAST((CASE WHEN [Condition] THEN 1 ELSE 0 END) as bit) FROM Table_Name 

那么你可以使用

reader.GetBoolean(0)