合并位值,结果在 .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;
我有一个正在修改的预先存在的查询。结果数据作为数据集直接推送到 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;