2

在你的帮助下,我做了这两个QUERY。我发布了图片,因此您可以看到 ingreen squares是我希望看到的空值,而 inred squares是我不想显示的值。变量vyberradek插入“子键”的值,它INT位于 DB 中,但我通过string.

所以我会简化:现在我可以显示全部或部分,你能帮我如何显示正确的记录吗?

这首先query是这样做的:

在此处输入图像描述

string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}'  GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

这是第二个query在此处输入图像描述

 string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and klisluz.subkey ='" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

如您所见,我还想显示空的。我认为您可能还需要检查复选框的代码:

 for (int i = 0; i < dtg_ksluzby.Rows.Count; i++)
            {
                var row = dtg_ksluzby.Rows[i];
                int id = (int)row.Cells["ID"].Value;

                using (var novyprikaz3 = new SqlCommand("SELECT * from klisluz WHERE subkey='" + vyberradek + "'AND IDzajsluz=" + id, spojeni))
                {

                    spojeni.Open();
                    SqlDataReader precti3 = novyprikaz3.ExecuteReader();
                    if (precti3.HasRows)
                    {
                        row.Cells[5].Value = true;
                    }
                    spojeni.Close();
                }
            }

你们能否建议我如何query选择未选中的值(不在表 klisluz 中)和选中的值?

我看到没有人回复得这么好,让我举一个简单的例子:当我创建客户端时,我检查了 10 个复选框中的 3 个。所以它选择了 3 行(以及它添加到表 klisluz 中的那些)。我有这两个queriesFirst query显示来自其他客户端的选中复选框,但也显示此客户端的未选中复选框。它只是显示数据库中的所有内容,因此它显示带有其他客户端检查的内容的行(但只有那些与此客户端和其他一些客户端相同的行,它不会创建重复项)。第二个节目只检查了这个客户,但没有他没有选择的那些。所以当我编辑这个客户时,我想显示他检查了什么以及剩下的 7 个(他没有检查的 7 种可能性,所以我可以检查它们)。现在我只能显示我检查的内容(没有未检查的内容)或包括其他客户端检查在内的所有内容(对于此客户端来说相同)。我希望这是可以理解的,对不起我的英语不好。

PS检查我的意思是检查checkbox(选择行)基本上它是一个向客户添加服务的程序。

非常感谢您的兴趣,如果您阅读了所有内容,也感谢您阅读。我在这个问题上坚持了 2 天:/

kwwallpe 的图片:您可以​​在此处看到“Nic”从未被任何客户选择,因此它被显示出来。

为了让我的问题更清楚 - 我从另一个表中获取其中一些列(如您在 sql 查询中所见)。

这就是 kwwallpe 的代码:

 string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') = '" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

这段代码非常接近我认为那 2。因为它选择了任何客户 b4 从未选择过的值。您可以看到帽子“Nic”被显示,因为它不在 klisluz 表中。

在此处输入图像描述

4

1 回答 1

2

如果我了解您所追求的,这就是阻止您获取 klisluz 中没有条目的行的部分:

WHERE zajsluz.akce= '{0}' and klisluz.subkey ='" + vyberradek + "'

对于 klisluz 中不存在的行,子键将为 NULL,它不会与该 WHERE 子句匹配任何内容。要同时获取这些行,您可以将当前的 WHERE 子句替换为:

WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') ='" + vyberradek + "'

这是完整的代码行:

string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') = '" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

要确定是否应选中复选框:

if (precti3.HasRows)
{
    precti3.Read();
    if (precti3.Item("subkey") != Null)
    {
        row.Cells[5].Value = true;
    }
    else
    {
        row.Cells[5].Value = false;
    }
}

认为这就是它在 C# 中的表现。我在 VB.NET 中工作,为此使用了在线转换器。

于 2013-07-19T11:56:33.960 回答