合并位值,结果在 .NET Datagridview 中显示为复选框

Coalesce bit value with result appearing as a Checkbox in .NET Datagridview

我有一个正在修改的预先存在的查询。结果数据作为数据集直接推送到 DataGridView 对象中。有多个位字段导致 datagridview 元素中的复选框。我想模仿这个功能,但我需要在我的特定领域使用 Coalesce。 SQL 如下所列:

SELECT res_id
        , res_resolution [Resolution]
        , res_type [Res. Type]
        , res_is_refund [Refund]
        , res_ship_replacement_today [Ship Today]
        , res_ship_replacement_after_return [Ship After Return]
        , res_return_required [Ret. Req.]
        , res_test [Test]
        , res_menu_divider [Menu Div.]
        , res_orderby [Menu Order]
        , res_new_return [New Returns]
        , res_process_return [Receive Returns]
        , res_modified [Last Updated]
        , res_active [Active]
        , COALESCE(rra_is_mispull_error, 0) [Mispull]
    FROM   jfi_return_resolution
          LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
    ORDER BY res_orderby;

上述查询的结果在功能上是正确的,但合并显示为 1 或 0。由于这是面向客户端的,因此我需要将其设为复选框。其他字段(例如 res_is_refund)作为复选框正确显示在 DataGridView 中。

我试图将合并功能更改为 COALESCE(rra_is_mispull_error,false) [Mispull],但这只会使应用程序崩溃。一起删除 COALESCE 会导致一堆空值,这与 1 和 0 一样糟糕。

将数据传输到 DataGridView 的 C# 采用这种形式(作为伪代码,因为它不是一种可以轻松传输到论坛的形式 post)

SqlDataAdapter SDA = new SqlDataAdapter();
DataSet ds = new DataSet();

Using(SqlConnection Conn ...)
{
    conn.Open();
    using(SqlCommand cmd = new SqlCommand(sql,conn))
    {
        SDA.SelectCommand = cmd;
        SDA.Fill(ds);
    }
}

MyDGV.DataSource = ds.Tables[0].DefaultView;

您可以假设 C# 代码和 SQL 实际上在 Coalesce 问题之外正常运行。

如果你在数据库中的列是 BIT,你必须将 0 转换为位,如下所示:

COALESCE(rra_is_mispull_error, CAST(0 AS bit))

否则,在数据集中创建列时,结果将被解释为 INT。

如果数据库中的列是 INT,则必须转换 COALESCE 的整个结果:

CAST(COALESCE(rra_is_mispull_error, 0) AS bit)

这应该可以解决问题:

SELECT res_id
    , res_resolution [Resolution]
    , res_type [Res. Type]
    , res_is_refund [Refund]
    , res_ship_replacement_today [Ship Today]
    , res_ship_replacement_after_return [Ship After Return]
    , res_return_required [Ret. Req.]
    , res_test [Test]
    , res_menu_divider [Menu Div.]
    , res_orderby [Menu Order]
    , res_new_return [New Returns]
    , res_process_return [Receive Returns]
    , res_modified [Last Updated]
    , res_active [Active]
    , CASE
         WHEN ISNULL(rra_is_mispull_error, 0) = 0 THEN 'false'
         ELSE 'true'
      END AS [Mispull]
FROM   jfi_return_resolution
      LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
ORDER BY res_orderby;

如果您在 rra_is_mispull_error 列中的数据属于 INT 类型并且您只有以下范围 [0-1] 那么您可以这样做:

SELECT res_id
    , res_resolution [Resolution]
    , res_type [Res. Type]
    , res_is_refund [Refund]
    , res_ship_replacement_today [Ship Today]
    , res_ship_replacement_after_return [Ship After Return]
    , res_return_required [Ret. Req.]
    , res_test [Test]
    , res_menu_divider [Menu Div.]
    , res_orderby [Menu Order]
    , res_new_return [New Returns]
    , res_process_return [Receive Returns]
    , res_modified [Last Updated]
    , res_active [Active]
    , CAST(ISNULL(rra_is_mispull_error, 0) AS BIT) AS [Mispull]
FROM   jfi_return_resolution
      LEFT JOIN jfi_return_resolution_attribute rra ON rra.rra_res_id = res_id
ORDER BY res_orderby;