【问题标题】:ExecuteScalar() errorExecuteScalar() 错误
【发布时间】:2014-11-09 10:07:08
【问题描述】:

我想用 C# 创建一个登录表单。如果用户名和密码正确,我不会收到错误消息,但如果错误,则会在此行中收到错误消息:

int count = Convert.ToInt32(cmd.ExecuteScalar().ToString());

登录表单代码:

if (textBox1.Text != "" & textBox2.Text != "")
{
    conn.Open();
    SqlCeCommand cmd = new SqlCeCommand("SELECT id FROM users WHERE Login = '" + textBox1.Text + "' AND Password = '" + textBox2.Text + "'", conn);
    int count = Convert.ToInt32(cmd.ExecuteScalar().ToString());
    if (count > 0)
    {
        SqlCeDataReader reader = cmd.ExecuteReader();
        reader.Read();
        int logged_id = Convert.ToInt16(reader["id"]);
        SqlCeCommand cmd1 = new SqlCeCommand("SELECT Login, Sex, Weight, Height, Age, PhyActi FROM vartotojai WHERE ID = '"+ logged_id +"'",conn);
        SqlCeDataReader reader1 = cmd1.ExecuteReader();
        reader1.Read();
        textBox9.Text = Convert.ToString(reader1["Sex"]);
        textBox10.Text = Convert.ToString(reader1["Weight"]);
        textBox12.Text = Convert.ToString(reader1["Height"]);
        textBox11.Text = Convert.ToString(reader1["Age"]);
        textBox13.Text = Convert.ToString(reader1["Phyacti"]);
        panel1.Visible = false;
        dataGridView1.Visible = false;
        MessageBox.Show("Loggen In!");
        toolStripStatusLabel1.Text = "Welcome, " + Convert.ToString(reader1["Login"]);
    }
    else
        MessageBox.Show("User Not Found!");
    conn.Close();
}

【问题讨论】:

  • 这是因为如果用户名和密码不匹配,您的查询将不会返回任何内容
  • 尝试在查询中使用计数 SqlCeCommand cmd = new SqlCeCommand("SELECT Count(id) FROM users WHERE Login = '" + textBox1.Text + "' AND Password = '" + textBox2.Text + " '", conn);
  • 究竟是什么错误? cmd.ExecuteScalar() 返回的值是多少?你的CurrentCulture 是什么?而且您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。使用 using 语句 来处理您的数据库连接和对象。请不要将您的密码存储为纯文本
  • 另外,尽管这里确实不相关,但请查看 &&& 之间的区别

标签: c# sql database executescalar


【解决方案1】:

如果您查看 MSDN HERE 中的 ExecuteScalar 帮助

然后您会注意到,如果结果集为空,则返回值是空引用。

在您的代码中,当用户名和/或密码错误时,您不会得到任何值,即返回空引用。现在,您尝试将 null 值转换为 Integer 并收到错误。

您应该做的是,您应该在system.object 变量中获取返回值并检查它是否为空。如果没有,则将其转换为整数,否则显示消息“找不到用户”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2013-03-12
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多