2016-12-03 3 views
0

Итак, я работаю над проектом для моего класса. Первая часть - это форма входа, которая требует, чтобы пользователь вводил имя пользователя и пароль. Когда нажата кнопка входа в систему, программа должна сравнить текст текстового поля с тем, что находится в datatable. Проблема только в том, что мне сложно это делать. Я попытался сделать это с помощью операторов LINQ, но это сделало значения отличными от того, что я ожидал, когда я пошел его отлаживать. Я здесь что-то не так? Heres код для формы.Сравнение значений текстового поля с базой данных

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SqlClient; 
using System.Data.Entity; 
using System.Data.Entity.Validation; 

namespace mcshonsey_Final 
{ 
public partial class LoginForm : Form 
{ 
    SortingClass sort = new SortingClass(); 

    mcshonsey_FinalProject.UserShowDBEntities dbcontext = null; 

    public LoginForm() 
    { 
     InitializeComponent(); 
     textBox1.Text = ""; 
     textBox2.Text = ""; 
     textBox1.Focus(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (dbcontext != null) 
      dbcontext.Dispose(); 

     dbcontext = new mcshonsey_FinalProject.UserShowDBEntities(); 

      dbcontext.UserTables 
       .OrderBy(entry => entry.UserID) 
       .Load(); 

     if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text)) 
     { 
      MessageBox.Show("You must enter a password or username", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      textBox1.Focus(); 
     } 

     /*else 
     { 
      ShowSelectForm ssf = new ShowSelectForm(this, sort); 
      Hide(); 
      ssf.Show(); 
     }*/ 
     string num1 = Convert.ToString(textBox1.Text); 
     string num2 = Convert.ToString(textBox2.Text); 

     var user = 
      from use in dbcontext.UserTables 
      where use.UserName == num1 
      select use; 

     var user2 = 
      from pas in dbcontext.UserTables 
      where pas.UserPassword == num2 
      select pas; 

     if (textBox1.Text.Equals(user) && textBox2.Text.Equals(user2)) 
     { 
      ShowSelectForm ssf = new ShowSelectForm(this, sort); 
      Hide(); 
      ssf.Show(); 
     } 

     else 
     { 
      MessageBox.Show("Incorrect username and/or password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      textBox1.Focus(); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (MessageBox.Show("Are you sure you want to quit?", "Exit", MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      Application.Exit(); 
     } 
    } 

    private void LoginForm_Load(object sender, EventArgs e) 
    { 

    } 
} 
} 

The SortingClass класс для сортировки через DataTable, но это на более позднее время. UserShowDBEntities - это сама база данных.

+0

«Я попытался сделать это с помощью операторов LINQ, но это сделало значения отличными от того, что я ожидал». Хорошо, расскажи нам, чего ты ожидал и что у тебя на самом деле. – ChrisF

+0

Также почему вы вызываете 'Convert.ToString' то, что уже является строкой? – ChrisF

+0

Я ожидал, что пользователь и user2 будут такими же, как значения имени пользователя и пароля текстовых полей. Вместо этого он вышел как-то вроде этого:... + \t \t пользователь \t {ВЫБОР [Extent1] [Идентификатор_пользователя] AS [Идентификатор_пользователя], [Extent1] [UserName] AS [UserName], [Extent1] [UserPassword] AS [UserPassword] FROM [dbo]. [UserTable] AS [Extent1] WHERE [Extent1]. [UserName] = @ p__linq__0} \t System.Linq.IQueryable {System.Data.Entity.Infrastructure. DbQuery } –

ответ

1

Я не являюсь пользователем LINQ to SQL, но я считаю, что следующее будет работать для вас.

В принципе, я сделал следующие изменения: 1. Комбинированное имя пользователя и пароль проверки в один ИНЕКЕ 2. Если вы получаете соответствующий запись обратно (т.е. Enumerable.Count чек) это означает, что имя пользователя и пароль соответствуют запись и, следовательно, были правильными.

private void button1_Click(object sender, EventArgs e) 
{ 
    if (dbcontext != null) 
     dbcontext.Dispose(); 

    dbcontext = new mcshonsey_FinalProject.UserShowDBEntities(); 

     dbcontext.UserTables 
      .OrderBy(entry => entry.UserID) 
      .Load(); 

    if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text)) 
    { 
     MessageBox.Show("You must enter a password or username", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     textBox1.Focus(); 
    } 

    /*else 
    { 
     ShowSelectForm ssf = new ShowSelectForm(this, sort); 
     Hide(); 
     ssf.Show(); 
    }*/ 

    var user = 
     from use in dbcontext.UserTables 
     where use.UserName == textBox1.Text && use.Password == textBox2.Text 
     select use; 

    if (Enumerable.Count(user) > 0) 
    { 
     ShowSelectForm ssf = new ShowSelectForm(this, sort); 
     Hide(); 
     ssf.Show(); 
    } 

    else 
    { 
     MessageBox.Show("Incorrect username and/or password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     textBox1.Focus(); 
    } 
} 
+0

Это действительно исправить. Спасибо за помощь. –

+0

Нет проблем. Не могли бы вы принять ответ, который я написал? –

0

Надеюсь, ваш источник данных будет заполнен, а ваш пароль не зашифрован в базе данных.

var user = dbcontext.UserTables.FirstOrDefault(u => u.UserName == textBox1.Text && u.UserPassword == textBox2.Text); 

if(user != null) 
    // Check 
else 
    // Failed 

textBox1 Если это имя пользователя и textBox2 это пароль, это должно работать.

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