将 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 端)是将值01 转换为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 server中的go

如何在动态SQL(SQL Server)中的Select语句中使用游标值

避免在 SQL Server 中的 INSERT INTO SELECT 查询中重复

将@@ rowcount分配给SQL Server存储过程中的变量

SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数

SQL Server 中的 PIVOT 不支持 Select 语句