发生 'System.Data.OleDb.OleDbException' 类型的未处理异常
An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred
我正在创建一个程序,用户将在其中登录系统,但出现这样的错误,
此外,我还在使用 C# 编程语言和数据库中的 Ms Access。
这是我的全部代码。
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Data.OleDb;
using System.Drawing.Drawing2D;
namespace Shakeys_Inventory_System
{
public partial class frmLogin : Form
{
private OleDbConnection cn = new OleDbConnection();
public frmLogin()
{
//SplashScreen
Thread t = new Thread(new ThreadStart(SplashStart));
t.Start();
Thread.Sleep(2500);
InitializeComponent();
this.BackColor = Color.White;
panel1.BackColor = Color.FromArgb(25, Color.Black);
t.Abort();
cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
}
//Blurred Panel *START
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
}
public void SplashStart()
{
Application.Run(new frmSplashScreen());
}
public void DrawPath(Pen pen, GraphicsPath path)
{
}
private void frmLogin_Load(object sender, EventArgs e)
{
}
//Button Login Start
private void btn_Login_Click(object sender, EventArgs e)
{
cn.Open();
OleDbCommand cm = new OleDbCommand();
cm.Connection = cn;
cm.CommandText = "Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
OleDbDataReader odr = cm.ExecuteReader();
int cnt = 0;
while (odr.Read())
{
cnt++;
}
if (cnt == 1)
{
this.Hide();
frmHomepage fhp = new frmHomepage("Welcome:"+ txt_Username.Text);
fhp.ShowDialog();
}
else
{
MessageBox.Show("Username or Password is Incorrect!", "ERROR!",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);
}
cn.Close();
}
//Button Quit *Start
private void btn_Quit_Click(object sender, EventArgs e)
{
DialogResult Result1 = MessageBox.Show("Do you want to CLOSE the program?", "Warning!",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if (Result1 == DialogResult.Yes)
{
Application.Exit();
}
}
}
}
顺便说一句,我在 MSACESS 中创建了自己的数据库,并将其中的路径文件复制到我的,
cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
路径文件是对的,我的查询也是对的,table还有,我的问题是,为什么会报错?
感谢您的帮助!
?字符是你想要参数的地方的占位符
cm.CommandText = "Select * from UsernameInfo where Username = ? and password = ?";
现在,按照编写查询的顺序添加参数
cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
现在执行您的查询
OleDbDataReader odr = cm.ExecuteReader();
如果有人要在文本中包含一个 ' 字符,它会预先关闭引用的连接并丢弃其余部分,从而导致错误。
此外,您的路径有一个额外的 space "C: \" 而不是 "C:\"
反馈
澄清“?”。如果您连接一个字符串来构建一个查询,那么您就对 sql 注入完全开放。这 ”?” (字面意思是 ? 字符)充当占位符的意思。我将向查询命令提供 "parameters",我希望你将第一个参数放在第一个“?”的位置。位于,第二个参数在第二个“?”。
那么,让我们看一下您的原始查询
"Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
假设我为
输入了以下值
txt_Username.Text = "O'Brien"
txt_Password.Text = "it's ok"
你得到的 sql 命令实际上会变成
Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
注意用户和密码 VALUES 周围不匹配的引号余额。
通过使用“?”作为占位符
Select * from UsernameInfo where Username = ? and password = ?
cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
会变成
Select * from UsernameInfo where Username = [value of first parameter] and password = [value of second parameter]
引擎会识别字符串、数字、日期等数据类型并为您处理。您可以更明确地声明参数的类型,但它通常会为您检测类型。
现在,对于 SQL-注入,我对通过访问的暴露并不乐观,但通常是“;”分号表示一个 sql 语句的结束并允许另一个。有人猜出了你的 table 的名字。在 SQL 中,双破折号被认为是后面的注释并忽略它。同样,这只是一个示例。您通过构建字符串构建的查询
Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
和 txtUser_Name.Text 的值 = "' OR 1=1;截断 table YourTable;--"
结果查询看起来像
Select * 来自 UsernameInfo where Username = '' OR 1=1;截断 table YourTable; --' and password = '没关系'
你实际上会执行第一个语句,它会通过 "OR 1=1" return 所有行,这总是正确的,然后下一个语句会删除 "YourTable" 中的所有记录,这可能成为您数据库的一部分。最后,'和密码部分将被完全忽略,因为它是通过 --.
评论的
更有意义?
我正在创建一个程序,用户将在其中登录系统,但出现这样的错误,
此外,我还在使用 C# 编程语言和数据库中的 Ms Access。
这是我的全部代码。
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Data.OleDb;
using System.Drawing.Drawing2D;
namespace Shakeys_Inventory_System
{
public partial class frmLogin : Form
{
private OleDbConnection cn = new OleDbConnection();
public frmLogin()
{
//SplashScreen
Thread t = new Thread(new ThreadStart(SplashStart));
t.Start();
Thread.Sleep(2500);
InitializeComponent();
this.BackColor = Color.White;
panel1.BackColor = Color.FromArgb(25, Color.Black);
t.Abort();
cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
}
//Blurred Panel *START
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
}
public void SplashStart()
{
Application.Run(new frmSplashScreen());
}
public void DrawPath(Pen pen, GraphicsPath path)
{
}
private void frmLogin_Load(object sender, EventArgs e)
{
}
//Button Login Start
private void btn_Login_Click(object sender, EventArgs e)
{
cn.Open();
OleDbCommand cm = new OleDbCommand();
cm.Connection = cn;
cm.CommandText = "Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
OleDbDataReader odr = cm.ExecuteReader();
int cnt = 0;
while (odr.Read())
{
cnt++;
}
if (cnt == 1)
{
this.Hide();
frmHomepage fhp = new frmHomepage("Welcome:"+ txt_Username.Text);
fhp.ShowDialog();
}
else
{
MessageBox.Show("Username or Password is Incorrect!", "ERROR!",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);
}
cn.Close();
}
//Button Quit *Start
private void btn_Quit_Click(object sender, EventArgs e)
{
DialogResult Result1 = MessageBox.Show("Do you want to CLOSE the program?", "Warning!",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if (Result1 == DialogResult.Yes)
{
Application.Exit();
}
}
}
}
顺便说一句,我在 MSACESS 中创建了自己的数据库,并将其中的路径文件复制到我的,
cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
路径文件是对的,我的查询也是对的,table还有,我的问题是,为什么会报错?
感谢您的帮助!
?字符是你想要参数的地方的占位符
cm.CommandText = "Select * from UsernameInfo where Username = ? and password = ?";
现在,按照编写查询的顺序添加参数
cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
现在执行您的查询
OleDbDataReader odr = cm.ExecuteReader();
如果有人要在文本中包含一个 ' 字符,它会预先关闭引用的连接并丢弃其余部分,从而导致错误。
此外,您的路径有一个额外的 space "C: \" 而不是 "C:\"
反馈
澄清“?”。如果您连接一个字符串来构建一个查询,那么您就对 sql 注入完全开放。这 ”?” (字面意思是 ? 字符)充当占位符的意思。我将向查询命令提供 "parameters",我希望你将第一个参数放在第一个“?”的位置。位于,第二个参数在第二个“?”。
那么,让我们看一下您的原始查询
"Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
假设我为
输入了以下值txt_Username.Text = "O'Brien"
txt_Password.Text = "it's ok"
你得到的 sql 命令实际上会变成
Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
注意用户和密码 VALUES 周围不匹配的引号余额。
通过使用“?”作为占位符
Select * from UsernameInfo where Username = ? and password = ?
cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
会变成
Select * from UsernameInfo where Username = [value of first parameter] and password = [value of second parameter]
引擎会识别字符串、数字、日期等数据类型并为您处理。您可以更明确地声明参数的类型,但它通常会为您检测类型。
现在,对于 SQL-注入,我对通过访问的暴露并不乐观,但通常是“;”分号表示一个 sql 语句的结束并允许另一个。有人猜出了你的 table 的名字。在 SQL 中,双破折号被认为是后面的注释并忽略它。同样,这只是一个示例。您通过构建字符串构建的查询
Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
和 txtUser_Name.Text 的值 = "' OR 1=1;截断 table YourTable;--"
结果查询看起来像 Select * 来自 UsernameInfo where Username = '' OR 1=1;截断 table YourTable; --' and password = '没关系'
你实际上会执行第一个语句,它会通过 "OR 1=1" return 所有行,这总是正确的,然后下一个语句会删除 "YourTable" 中的所有记录,这可能成为您数据库的一部分。最后,'和密码部分将被完全忽略,因为它是通过 --.
评论的更有意义?