2016-03-06 103 views
0

我創建一個程序,其中,用戶將登錄到系統,但它得到這樣的錯誤,類型的未處理的異常「System.Data.OleDb.OleDbException」發生

而且我使用來自我的數據庫的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和路徑的文件複製並填寫Flash到我,

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

的路徑文件是正確的,我的查詢也是正確的,表還,我的問題是,爲什麼我得到一個錯誤?

感謝您的幫助!

+0

哪行代碼會拋出錯誤? –

+0

*爲什麼我得到一個錯誤?*,僅僅給出異常類型是不夠的。您需要提供異常消息,最好是堆棧跟蹤。 (拋出異常的內部異常也是如此)。 –

+0

開放式的SQL注入。參數化您的查詢。 – DRapp

回答

0

?性格是你想要參數

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注入來說就是WIDE-OPEN。 「?」 (字面上的?字符)充當佔位符的含義。我將爲查詢命令提供「參數」,並且我希望您將第一個參數放在第一個「?」的位置。位於第二個「?」的第二個參數。

所以,讓我們來看看你的原始查詢

"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語句的結束並允許另一個。有人已經找出了你的桌子的名字。在SQL中,雙短劃線被認爲是一個註釋,並忽略它。再次,這只是一個SAMPLE。您的查詢與建立字符串

Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok' 

和txtUser_Name.Text =值構建 「」 OR 1 = 1;截斷表YourTable; - 」

結果查詢看起來像 從UsernameInfo SELECT *其中Username =''OR 1 = 1;截斷表格YourTable; - '和密碼='沒關係'

您將實際執行第一條語句,它將通過總是爲真的「OR 1 = 1」返回所有行,然後下一條語句將從「 YourTable「,它可能是你數據庫的一部分。最後,'和密碼部分將被完全忽略,因爲它是通過 - 評論的。

更有意義嗎?

+0

@raphaelmendoza的代碼中,查看關於參數和sql注入的澄清的修訂答案。 – DRapp

相關問題