2016-08-16 11 views
0

私は、ユーザー名とパスワードの3つの列を持つデータを持っています。 私は、アクセスを許可するかどうかを確認するためのユーザ名とパスワードをチェックするログイン画面を持っています。私は別のフォームにユーザーの名前を表示しようとしていますが、私が持っているものは動作していません。C#のデータテーブルからデータを取得する

私はloginを押してIndexOutOfRangeExceptionが表示されるまでプログラムが実行されます。私はデータが入っている正しいセルを呼んでいないように感じますが、わかりません。私はデータテーブルには非常に新しいです。

ログインフォーム:

namespace Inventory_Program 
{ 
    public partial class Login : Form 
    { 
     public string name; 

     public Login() 
     { 
      InitializeComponent(); 
     } 


     /* 
     * Used when user accepts to login. username and password must be correct or error message will display 
     * Using a table in sql form. 
     */ 
     private void loginButton_Click(object sender, EventArgs e) 
     { 
      SqlConnection connection = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\brand\Documents\Data.mdf; Integrated Security = True;"); 
      SqlDataAdapter adapter = new SqlDataAdapter("Select Count(*) From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'", connection); 
      DataTable dt = new DataTable(); 
      adapter.Fill(dt); 
      if (dt.Rows[0][0].ToString() == "1") 
      { 

       name = dt.Rows[0][3].ToString(); 
       this.Hide(); 
       MainGUIPanel mainview = new MainGUIPanel(); 
       mainview.Show(); 

      } 
      else 
      { 
       MessageBox.Show("Username or Password Incorrect! Try Again!"); 
      } 

     } //end of login button 


     //can canel out of login in screen, closes window. 
     private void cancelButton_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } //end of cancel button 


     public string getName() 
     { 
      return name; 
     } 
    } 
} 

MainGuiView:

namespace Inventory_Program 
{ 
    public partial class MainGUIPanel : Form 
    { 

     Login login = new Login(); 

     public MainGUIPanel() 
     { 
      InitializeComponent(); 

      //runs the current time and data 
      currentTime.Start(); 

     } 

     //Method is adding a horizontal line to the top panel 
     private void topControlPanel_Paint(object sender, PaintEventArgs e) 
     { 

      Graphics graphics = e.Graphics; 
      Pen pen = new Pen(Color.Black, 1); 
      graphics.DrawLine(pen, 1091, 93, 00, 93); 
      graphics.Dispose(); 

      nameLabel.Text = login.getName(); 

     } 

     //allows for the current time and date to be displayed in the top panel 
     private void currentTime_Tick(object sender, EventArgs e) 
     { 
      DateTime dateTime = DateTime.Now; 

     } 

     private void inventoryButton_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+1

おそらく、インデックスはゼロベースなので、 'name = dt.Rows [0] [2] .ToString();' '[0] [3]'は** 4番目の列にアクセスしようとしています。 –

答えて

0
Select Count(*) From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'" 

は、アダプタに一つだけのアイテムを入れます:数(カウントから(*)よりも何もないことで表をdt.Rows [0] [0]。

Select UserName From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'" 

以下を参照してください。これは、そこのすべてのハッカーにとって非常に脆弱です!

name = dt.Rows[0][0].ToString(); 

注意の言葉、これは重要です:私は実際にSQL Serverのインジェクション攻撃をルックアップすることをお勧めします。あなたのコードはこれに非常に脆弱です。わずかに経験豊富なプログラマーがあなたのアプリケーションにログインしたり、ユーザー名やパスワードのフィールドにコードを入力するだけで、資格情報なしでデータベースを消去することができます。

+0

応答していただきありがとうございます。私はSQL Serverのインジェクション攻撃を調べ、自分のコードを書き直すつもりです。入力いただきありがとうございます。私はSQLに新しいですし、できる限り多くのことを学びたいと思っています。一度私はそれを完全に私はここにそれを投稿するつもりです。それを見直して改善の提案をしてもらえますか? – bgrow11

+0

私はあなたの記事を見守ります。ハッピーコーディング。 –

0

エラーは次の場所にあります。name = dt.Rows [0] [3] .ToString();

選択:カウント(*): 1列のみを返します。

表示する列を選択する必要があります。 where句で異なる結果を選択する必要があるため、結果を数える必要はありません。代わりに、データテーブルrows.countが1より大きいかどうかを確認してください。

関連する問題