[英]An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll. String from Access
[英]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");
路徑文件正確,查詢也正確,表格也正確,我的問題是,為什么會出現錯誤?
謝謝您的幫助!
? 字符是所需參數的占位符
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();
如果有人要在文本中包含'字符,它將預先關閉引用的串聯,並將其余的丟棄,從而導致錯誤。
此外,您的路徑還有一個多余的空間“ C:\\”,而不是“ C:\\”
反饋
澄清“?”。 如果連接字符串以構建查詢,則對sql-injection寬泛。 “?” (字面上的?字符)充當占位符的含義。 我將向查詢命令提供“參數”,並且希望您將第一個參數放在第一個“?”位置。 位於,第二個參數位於第二個“?”。
因此,讓我們來看看您的原始查詢
"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]
引擎將識別字符串,數字,日期等數據類型,並為您處理。 您可以更明確地聲明參數的TYPE,但是通常它將為您檢測類型。
現在,對於SQL-Injection,對於通過訪問進行公開並不樂觀,但通常是“;” 分號表示一個sql語句的結尾,並允許另一個。 有人弄清楚了表的名稱。 在SQL中,雙破折號被認為是注釋,並忽略它。 同樣,這只是一個示例。 您的查詢是通過構建字符串構建的
Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
和txtUser_Name.Text的值=“'OR 1 = 1;截斷表YourTable;-”
結果查詢看起來像Select * from UsernameInfo,其中Username =''OR 1 = 1; 截斷表YourTable; -和密碼=“沒關系”
您實際上將執行第一個語句,該語句將始終通過“ OR 1 = 1”返回所有行,然后下一條語句將從“ YourTable”中刪除所有記錄,該“ YourTable”可能是數據庫的一部分。 最后,“和密碼”部分將被完全忽略,因為它通過-進行了注釋。
更有意義嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.