2016-08-16 3 views
0

У меня есть данные, которые имеют три столбца: Имя пользователя Пароль и имя. У меня есть логин на экране, который проверяет, что проверяет имя пользователя и пароль, чтобы разрешить доступ или нет. Я пытаюсь отобразить Имя пользователя на другой форме, но то, что у меня есть, не работает.Извлечение данных из Datatable в C#

Программа запускается до тех пор, пока я не нажимаю логин, а затем отображается 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]' будет пытаться получить доступ к столбцу ** четвертый **. –

ответ

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

Кладет только один элемент в адаптере: стол в нем с не более чем число (от Count (*) в dt.Rows [0] [0].

Вам нужно что-то вроде:

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

См. Ниже! Это очень уязвимо для всех их хакеров!

и

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

Слово предостережения, и это важно: я действительно призываю вас искать атаки SQL-инъекции сервера. Ваш код очень уязвим для этого. Немного опытный программист может войти в ваше приложение или уничтожить вашу базу данных без учетных данных, просто набрав код в поле имени пользователя или пароля.

+0

Спасибо за ответ. Я собираюсь изучить атаки сервера sql server и работать над переписыванием моего кода. Спасибо за ввод. Я новичок в sql, и я стараюсь учиться как можно больше. Как только у меня его полностью, я отправлю его здесь. Не могли бы вы рассмотреть его и дать предложения по улучшению? – bgrow11

+0

Yup! Я буду следить за твоей записью. Счастливое кодирование. –

0

Ошибка расположена по адресу: name = dt.Rows [0] [3] .ToString() ;.

Выбираете: count (*), который возвращает только 1column.

Вам нужно выбрать столбцы, которые вы хотите отобразить. вам не нужно подсчитывать результаты, так как ваше предложение where должно выбирать различные результаты. Вместо этого проверьте, превышает ли количество строк rows.count больше 1.

Смежные вопросы