不显示带有SQL代码的表单

时间:2015-03-08 19:05:20

标签: c# sql sql-server winforms

好的,我是新手c#和SQL学习者。

我有一个连接到SQL Server数据库的登录表单。它早在我的VS 2010上工作(Adm_page表单和main_page表单正在显示),今天它停止显示只显示准备就绪的IDE。

以下是代码:

String query = "Select Count(*) from Login where Username ='" + Usn_txt.Text + "'and Password ='" + Psw_txt.Text + "' and Mode ='" + comboBox1.Text + "';";

SqlConnection con = new SqlConnection(con_string);
SqlDataAdapter da = new SqlDataAdapter(query, con);

DataTable dt = new DataTable();
da.Fill(dt);

if (dt.Rows[0][0].ToString() == "1")
{
        SqlDataAdapter da1 = new SqlDataAdapter("Select Mode from Login Where Username ='" + Usn_txt.Text + "'and Password ='" + Psw_txt.Text + "'", con);
        DataTable dt1 = new DataTable();
        da1.Fill(dt1);

        if (dt1.Rows[0][0].ToString() == "Admin")
        {                
            this.Hide();

            Adm_page aa = new Adm_page(Usn_txt.Text);
            aa.ShowDialog();
            Usn_txt.Clear();
            Psw_txt.Clear();
            this.Show();
        }
        else if (dt1.Rows[0][0].ToString() == "Student")
        {                    
            Main_page mm = new Main_page();
            mm.ShowDialog();
            this.Hide();
            Usn_txt.Clear();
            Psw_txt.Clear();
            this.Show();
        }
}
else
{
        MessageBox.Show("Username and Password Error");
}

正如我之前所说,表格一直显示到今天它停止时。 我意识到它与嵌套的if语句有关,因为当我只运行它时

String query = "Select Count(*) from Login where Username ='" + Usn_txt.Text + "'and Password ='" + Psw_txt.Text + "' and Mode ='" + comboBox1.Text + "';";
SqlConnection con = new SqlConnection(con_string);
SqlDataAdapter da = new SqlDataAdapter(query, con);    

DataTable dt = new DataTable();
da.Fill(dt);

if (dt.Rows[0][0].ToString() == "1")
{
    this.Hide();

    Adm_page aa = new Adm_page(Usn_txt.Text);
    aa.ShowDialog();
    Usn_txt.Clear();
    Psw_txt.Clear();
    this.Show();
 }

表单显示。

还有其他方法可以解决此问题或绕过此问题。请帮帮我?

1 个答案:

答案 0 :(得分:0)

根据您的评论和代码,您似乎无法获得数据库所期望的值。这就是为什么我要你调试你的代码,因为那时你会看到你得到的值,代码的哪些分支被执行等等。学习如何调试应用程序非常重要......

这些部分显然被评估为false

if (dt1.Rows[0][0].ToString() == "Admin")

else if (dt1.Rows[0][0].ToString() == "Student")

这可能是由于DB值与内联c#常量不匹配造成的,因为比较这样的值区分大小写。或者您可能添加了一个不适合这些条件的新模式。

代码永远不会停止工作,总是用户以某种方式参与其中。所以再一次 - 在Visual Studio中放置一个断点,仔细检查步骤,看​​看你得到了什么样的价值,看看窗帘后面究竟发生了什么。我们不能为你做那件事。


我还会在这里发表您对您的代码的评论,因此它更加清晰明了:

代码问题

例如,您通过将多个值连接在一起来在线构造sql查询。这可能会导致SQL注入(如果我们讨论Web开发)和sql命令中的各种拼写错误。你必须处理多个引号,注意关闭每个支撑等。当参数的数量增加时,代码变得非常快,并且维护成问题。接下来,将UI代码,SQL访问和可能的业务逻辑混合到一个文件中。现在你应该研究WPF,因为Webforms有点过时,非常非常笨重。

此外,我真的主张反对使用DataTables,DataSet等,因为它使重构成为一场噩梦。这对某些场景来说很好,但我真的不喜欢它们而更喜欢具体对象的集合。当您查看代码并查看列表时,您可以立即看到正在发生的事情。但是当你必须处理像dt.Rows [0] [0]这样的代码时..哦,亲爱的,那太可怕了。

您应该考虑处理处理外部资源的对象。它可能暂时不会给您带来问题,但学习最佳实践并使用它们是个好主意。 Tim Schmelter在这里很好地回答了这个问题:How should I correctly dispose of an object?