将 SQL Server 中的 SELECT 中的布尔值转换为 C# 中的布尔值?
Posted
技术标签:
【中文标题】将 SQL Server 中的 SELECT 中的布尔值转换为 C# 中的布尔值?【英文标题】:Getting a boolean from a SELECT in SQL Server into a bool in C#? 【发布时间】:2016-03-09 09:29:35 【问题描述】:我的 SELECT 中有此代码:
SELECT A.CompletedDate,
CASE
WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL) THEN 0
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId) THEN 1
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId IS NULL) THEN 1
ELSE 0
END AS [Current],
在我的 ASP.NET DTO 中,我有:
public partial class GetTestsDTO
public bool? GradePass get; set;
// the following line is what is giving the error. If I remove
// the line it will not try to convert the data and there is no
// error. Note that I want to put this into a bool as web.api
// then passes it to the client as a bool
public bool Current get; set;
public DateTime? CompletedDate get; set;
这给了我一个错误,我希望能得到一些帮助。
错误是:
message=从物化 'System.Int32' 类型的指定转换为 'System.Boolean' 类型无效。
【问题讨论】:
可能是因为你返回的是一个整数?CAST( 0 AS BIT)
和 CAST(1 AS BIT)
?
SQL Server 没有 公开的布尔数据类型,因此您不会在SELECT
中返回一个。正如小伙子建议的那样,它确实有一个 bit
数据类型,并且 ADO.Net 支持将 那些 转换为布尔值。
***.com/questions/5088577/…
@lad2025 - 我试过你的建议,效果很好。如果您想将此添加为我可以接受的答案。谢谢
【参考方案1】:
最简单的方法(SQL Server 端)是将值0
和1
转换为BIT
数据类型:
SELECT A.CompletedDate,
CASE
WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL)
THEN CAST(0 AS BIT)
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId)
THEN CAST(1 AS BIT)
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId IS NULL)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END AS [Current],
或一次整个表达式:
SELECT A.CompletedDate,
CAST((CASE
WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL) THEN 0
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId) THEN 1
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId IS NULL) THEN 1
ELSE 0
END)
AS BIT) AS [Current],
SQL Server Data Type Mappings:
╔═════════════════════════════════╦═════════════════════╦═══════════════════════╗
║ SQL Server Database Engine type ║ .NET Framework type ║ SqlDbType enumeration ║
╠═════════════════════════════════╬═════════════════════╬═══════════════════════╣
║ bit ║ Boolean ║ Bit ║
╚═════════════════════════════════╩═════════════════════╩═══════════════════════╝
【讨论】:
【参考方案2】:如 cmets 中所述,您将返回一个整数。您需要返回一个bit
,ASP.NET 会将其理解为布尔值。
SELECT A.CompletedDate,
CASE
WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL) THEN
CONVERT(bit, 0)
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId) THEN
CONVERT(bit, 1)
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId IS NULL) THEN
CONVERT(bit, 1)
ELSE
CONVERT(bit, 0)
END AS [Current],
或者正如下面 cmets 中指出的 Damien_The_Unbeliever,您可以将整个 CASE
语句包装在 CONVERT
中。
SELECT A.CompletedDate,
CONVERT(bit,
CASE
WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL) THEN 0
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId) THEN 1
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId IS NULL) THEN 1
ELSE 0
END
) AS [Current],
您也可以分别使用CAST(1 AS bit)
和CAST(0 AS bit)
代替CONVERT(bit, 1)
和CONVERT(bit, 0)
(有关详细信息,请参阅T-SQL Cast versus Convert)。
你也可以转换客户端:
using (SqlDataReader reader = command.ExecuteReader())
if (reader.Read())
var dto = new GetTestsDTO();
dto.Current = Convert.ToBoolean(reader.GetInt32(1));
【讨论】:
也许有必要在 else 语句中为 0 设置转换,因为 0 也是整数而不是布尔值。 完成。我一保存答案就注意到了! 或者只在CASE
之外而不是在每个THEN
内执行一次CONVERT
。【参考方案3】:
正如前面的 cmets 所建议的,SQL 不能返回“布尔”值,你也没有返回它。
我的建议/解决方案(我使用,并且在我工作的任何地方都看到使用)是简单地恢复您的对象中的整数,然后使用“映射”函数将该整数转换为布尔值。
(简单)方法会做这样的事情(注意;Java 版本提前):
public static boolean integerToBoolean(Integer myInt)
return myInt == 1 ? true : false;
祝你好运。
【讨论】:
或者直接使用Convert.ToBoolean(Int32) method【参考方案4】:below too works for me :-
我尝试以“真”/“假”的形式返回布尔值,它也很有效。
环境:C# - Dapper
SQL :- Sql Server 2012
示例:- CASE WHEN (@AdminTestId IS NULL AND @UserTestId IS NULL) THEN 'false'
WHEN (@AdminTestId = temp.AdminTestId AND @UserTestId = A.UserTestId) THEN 'true'
'true' or 'TRUE'
或 'false' or 'FALSE'
都有效——这两种情况都有效。
所以除了接受的答案,这是一个有效的答案,这也对我有用,是的,它也可能归因于 Dapper,以防万一它不起作用普通的 ADO.NET
【讨论】:
以上是关于将 SQL Server 中的 SELECT 中的布尔值转换为 C# 中的布尔值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在动态SQL(SQL Server)中的Select语句中使用游标值
避免在 SQL Server 中的 INSERT INTO SELECT 查询中重复
将@@ rowcount分配给SQL Server存储过程中的变量