Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDb数据库位置0处无行_C#_Database - Fatal编程技术网

C# OleDb数据库位置0处无行

C# OleDb数据库位置0处无行,c#,database,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

我试图添加一个更改密码功能到我的程序,但它不断拉错误。这是单击“保存”时应该运行的代码:

    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]时,该位置会出现相同的错误

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

  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");
                }

你做错了几件事

  • 对您的
    SELECT COUNT(*)
    语句使用
    ExecuteScalar
    ,这正是它的目的
  • 即使你不这样做,你也不会填写你的
    dt
  • 对于
    UPDATE
    语句,需要使用
    ExecuteNonQuery
    <代码>数据适配器用于返回一些数据
  • 您忘记在
    UPDATE
    语句中使用
    SET
  • 您需要使用
    来处理多个
    条件,而不是
  • 你应该经常使用。这种类型的字符串连接对攻击是开放的
  • 使用
    using
    语句自动处理连接和命令,而不是手动调用
    Close
    方法
  • 不要将密码存储为纯文本。阅读:
  • 密码是OLE DB提供程序中的密码。根据数据库管理器区分大小写的设置,您可能需要使用is as
    [密码]
    。但作为一种更好的方法,将其更改为非保留字,即使它是

    • 这是因为您缺少一个
      关键字。你的问题

      UPDATE login WHERE username ='" +
      
      应该是

      UPDATE login SET columnname = value WHERE username ='" +
      
      根据你发布的代码看起来应该是这样的

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

      尽管如此,还是要使用参数化查询,不要像现在这样连接用户输入,否则就为SQL注入打开了大门

      这一行的用途是什么?
      OleDbDataAdapter da=new-OleDbDataAdapter(“从登录名中选择COUNT(*),其中username='“+textBox1.Text+”,password='“+textBox2.Text+”,con)
      声明它,但从不执行代码来填充
      OleDbDataAdapter
      ,如果只返回一行,则应使用
      ExecuteScalar
      在有时间时搜索差异