簡體   English   中英

發生類型為'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");

路徑文件正確,查詢也正確,表格也正確,我的問題是,為什么會出現錯誤?

謝謝您的幫助!

字符是所需參數的占位符

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM