无法填写CheckedListBox

时间:2014-06-13 14:28:22

标签: c# winforms datareader

我正在尝试从数据库中检索数据。我添加了一个.sdf文件,并编写了如下所示的代码。我的表名为info,它有三列:idnamecode

我想要做的是用这些数据填充CheckedListBox,但是当我执行代码时没有任何反应。 CheckedListBox是空的。我做错了什么?

SqlCeDataReader dr;
SqlCeConnection con;
SqlCeCommand cmd;

void loadData() 
{
    cmd.CommandText = "select column_name from Information_schema.columns where table_name='info' order by ordinal_position";
    con.Open();
    dr = cmd.ExecuteReader();

    if (dr.HasRows) 
    {
        while (dr.Read()) {
        checkedListBox1.Items.Add(dr[0].ToString());
    }

    dr.Close();
    con.Close();
}

private void Form1_Load(object sender, EventArgs e)
{
    con = new SqlCeConnection();
    con.ConnectionString=@"Data Source=c:\users\xxx\documents\visual studio 2012\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Database1.sdf";
    cmd = new SqlCeCommand();
    cmd.Connection = con;
    loadData();
}

2 个答案:

答案 0 :(得分:0)

请尝试使用以下命令文本:

cmd.ComandText = "Select * from infor".

答案 1 :(得分:0)

您基本上要求调试您的代码段。由于几个原因,这很棘手。首先,您的代码调用数据库,并执行一个稍微奇怪的查询,因为它从系统数据库获取有关列的信息,而不是从您自己的表中获取的信息。这里没有人确切知道结果会是什么。有可能用具有类似效果的其他东西替换该行(例如,在代码中用一些虚拟值初始化的列表),但通过这样做我们可能会改变行为以便bug消失,我们会不要聪明。我们将在一分钟内回到这个想法。

这样的问题对StackOverflow来说并不理想。一个原因是我刚刚概述的内容 - 为了帮助您,可能很难复制您的代码所做的事情。因此,您可能无法获得有用的答案。另一个稍微相反的原因是某人(比我更勤奋和更敏锐)可能会在你的代码中发现一个简单的拼写错误或陷阱。当我输入时,这可能已经发生了。他们会发布一个答案或评论,指出这一点,你将修复你的代码。但是,这个问题对其他人来说并不是特别有用。没有人可能会像你一样做出相同的拼写错误。即使他们这样做,也可能会与CheckedListBoxSqlCeDataReader无关,但他们永远不会发现这个问题。

这些问题和答案实质上不会给这个网站增加任何内容。他们也不会对你特别有帮助,这就是为什么:你不会学会调试。

根据我的经验,优秀的程序员几乎总是很好的调试器。我们大多数人犯了很多小错误 - 快速找到并修复这些错误是平均生产力和高生产率之间的差异。作为一个好的调试器也意味着你与你的想法和你的(或别人的)代码有不同的关系。您可以更灵活地思考,同时掌握许多不同的案例和可能性。这被称为发散思维,并且慢慢被认为与融合思维一样重要,思维导致答案。

您应该采取哪些措施来解决您的问题并作为程序员正确调试。如果你已经完成了这个并且仍然面临一个棘手的问题(或者你的工具中可能存在错误),你可以使用更短的代码片段来发布,并且能够更好地描述非预期的行为。

基本上有两种方法可以调试这样的代码 - 单步执行它,以及打印行'。 (奇怪和困难的代码,如内核代码,多线程和消息传递可能更难调试 - 这两种技术将使你在其他方面取得很大进展。)两者的主要思想是你看看你的变量的中间值,在不同的评估阶段。调试支持在Visual Studio中单步执行C#代码是非常好的,但为了保持简单和合理的语言独立,我将使用打印行作为示例。

只需在程序中的任何位置添加一行,您想知道执行流程是否存在。例如

Console.WriteLine("We do have some rows");

应该在if (dr.HasRows) {行之后。如果这是一个控制台程序并且您运行它,您将在控制台窗口中看到此输出显示(或不显示)。否则,您可以使用Debug.Print将文字发送到'输出' VS的窗口,或Winforms MessageBox以在警报窗口中显示文本。

如果您的查询结果有任何行,您会立即发现。如果它没有,您的查询或执行方式有问题。首先应该以不同的方式在同一个数据库上运行相同的查询,例如sqlcmd或Sql Server Management Studio。你没有做到这一点,并且你不知道dr.HasRows是否真实,这一事实立即告诉我你没有正确调试。 [编辑:@Leonardo还在评论中确切地指出了同样的事情。]如果在其他地方运行查询时获得了一些有效的响应行,但在运行此代码时却没有,那么在设置连接或运行连接方面存在一些问题。在C#中查询。如果您没有获得任何行,则查询本身会出现问题。直接尝试不同的查询,直到找到正确的查询,然后将其放回C#代码中。 (第三种可能性是“没有行是正确的响应,并且您的代码应该知道如何正确处理这种情况。”

另一方面假设dr.HasRows是真的。 dr.Read或添加到复选框时出现问题。要消除前者,请尝试在内循环中使用printline。这次输出您感兴趣的值:

Debug.Print("Value to be added is: " + dr[0].ToString());

您将很快看到这些看起来是否合理。如果他们这样做,请尝试找出checkListBox1出了什么问题。在每次循环迭代后打印checklistBox1和/或checkListBox1.Items的值。尝试将一些不同的值,可能的字符串常量或硬编码的字符串列表写入Items,然后查看它是否有效。确保checkListBox1实际上是空的,并且在访问代码之前实际调用代码来填充它。

干得好,您刚刚学会了两种主要调试方法之一的主要两部分。您可以识别代码循环和分支的方式(通过输入信息打印行)

Console.WriteLine("Got this far!");

您可以找出数据的价值(通过打印变量的实际值)

Console.WriteLine("x is currently equal to " + x.ToString());

printlines的优点在于,无论何时控制某种输出或日志记录,都可以在没有任何其他工具的情况下进行调试。

现在,您将测试代码的每个步骤,观察传递给它的数据并从中返回。尝试确切地找出哪些部分按预期工作,哪些部分已经使用了前一步传递给它们的错误信息。您不确定的任何一点(如数据库访问),您尝试以不同的方式重新运行它在代码中的使用方式。例如,编写一个创建并显示ListCheckBox的两行程序,以确保您知道如何执行此操作。

如果你正在使用一些非常实验性的工具,你最终可能会发现它中的错误,并且你自己的代码也没问题。使用经过其他人广泛尝试和测试的技术,您不可能做到这一点。最可能的结果是你找到了你的(可能是简单的)bug并修复它。除此之外,您可以使用更小的测试用例回到StackOverflow,询问使用组件的方式不明显的事情或其他一些难以弄清楚的直接查询。 (Winforms和SQL Server都包含许多问题,这会产生很好的问题,可以帮助其他人。)当你这样做时,你将能够分享你的调试结果,让答案者确切地知道代码的确切位置。似乎表现得像预期的那样。如果您确实遇到类似这样的问题,也很可能会搜索并发现其他人已经遇到过此问题,并对其进行了解答。

不要忘记,一旦您完成调试,您可以将正常工作代码发送到http://codereview.stackexchange.com,以获取有关缩短,更优雅,更出色的建议而且更加防错。祝你好运!