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
在有时间时搜索差异