在位置0 OleDb数据库没有行

时间:2016-01-06 15:30:39

标签: c# database

我正在尝试为我的程序添加更改密码功能,但它会不断提取错误。这是你点击保存时应该运行的代码:

    private void button3_Click(object sender, EventArgs e)
    {

        OleDbConnection con = new OleDbConnection();
        con.ConnectionString = (@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\User\Desktop\esoft\gym\gym\bin\Debug\Clients.accdb");

        OleDbDataAdapter da = new OleDbDataAdapter(" SELECT COUNT(*) FROM login WHERE username='"+textBox1.Text+ "' AND password='" + textBox2.Text + "'",con);
        DataTable dt = new DataTable();

        con.Open();
        errorProvider1.Clear();
        if (dt.Rows[0][0].ToString() == "1")
        {
            if (textBox3.Text == textBox4.Text)
            {
                OleDbDataAdapter sda = new OleDbDataAdapter("UPDATE login WHERE username ='" + textBox1.Text + "', password='" + textBox2.Text + "' (password ='" + textBox3.Text + "')", con);
                sda.Fill(dt);
                MessageBox.Show("password successfully changed", "success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                errorProvider1.SetError(textBox3, "passwords dont match");
                errorProvider1.SetError(textBox4, "passwords dont match");
            }
        }

        else
        {
            errorProvider1.SetError(textBox1, "wrong username");
            errorProvider1.SetError(textBox2, "wrong pasword");

        }
        con.Close();
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

现在的主要错误是,当试图保存时,它会引发一个错误,指出在位置3没有找到任何行。当更改为[1] [5]时,它会为该位置拉出相同的错误。 / p>

我使用您的建议更改了代码,但仍然收到相同的错误。

  private void button3_Click(object sender, EventArgs e)
    {

        using (OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\User\Desktop\esoft\gym\gym\bin\Debug\Clients.accdb"))
        {


            OleDbDataAdapter da = new OleDbDataAdapter(" ExecuteScalar FROM login WHERE username='" + textBox1.Text + "' AND password='" + textBox2.Text + "'", con);
            DataTable dt = new DataTable();

            con.Open();
            errorProvider1.Clear();
            if (dt.Rows[0][0].ToString() == "1")
            {
                if (textBox3.Text == textBox4.Text)
                {
                    //   OleDbDataAdapter sda = new OleDbDataAdapter("UPDATE login SET password ='" + textBox3.Text + "' WHERE username ='" +textBox2.Text+"'");

                    OleDbCommand com = new OleDbCommand("UPDATE login SET password = '" + textBox3.Text + "' WHERE username = '" +textBox2.Text+"'",con);
                    com.ExecuteNonQuery();
                //    sda.Fill(dt);
                    MessageBox.Show("password successfully changed", "success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    errorProvider1.SetError(textBox3, "passwords dont match");
                    errorProvider1.SetError(textBox4, "passwords dont match");
                }

2 个答案:

答案 0 :(得分:1)

你做错了一些事情;

  • 使用ExecuteScalar代表您的SELECT COUNT(*)语句,这正是这个内容。
  • 即使,如果不这样做,也不会填满dt
  • 您需要使用ExecuteNonQuery作为UPDATE声明。 DataAdapter用于返回一些数据。
  • 您忘记在SET声明中使用UPDATE
  • 您需要对多个AND条件使用ORWHERE,而不是,
  • 您应该始终使用the formula。这种字符串连接可用于parameterized queries攻击。
  • 使用using语句自动处理您的连接和命令,而不是手动调用Close方法。
  • 不要将密码存储为纯文本。阅读:SQL Injection
  • 密码是OLE DB提供程序中的Best way to store password in database。根据您的数据库管理器区分大小写的设置,您可能需要使用is [password]。但作为一种更好的方法,将其更改为 - 保留的单词,即使它是。

答案 1 :(得分:1)

这是因为您错过了SET个关键字。您的查询

UPDATE login WHERE username ='" +

应该是

UPDATE login SET columnname = value WHERE username ='" +

根据您发布的代码,它应该是

UPDATE login SET password ='" + textBox3.Text + "' WHERE username ='" +

尽管如此,使用参数化查询并且不要像现在这样做那样连接用户输入,否则你已经打开了SQL注入的大门。