【问题标题】:Getting a boolean from a SELECT in SQL Server into a bool in C#?将 SQL Server 中的 SELECT 中的布尔值转换为 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 支持将 那些 转换为布尔值。
  • @lad2025 - 我试过你的建议,效果很好。如果您想将此添加为我可以接受的答案。谢谢

标签: c# asp.net sql-server


【解决方案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;
    }
    

    祝你好运。

    【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2011-12-26
      • 2011-03-22
      • 1970-01-01
      • 2020-01-05
      • 2016-01-28
      • 2017-03-07
      相关资源
      最近更新 更多