2013-10-01 2 views
0

У меня небольшая проблема с командой C# DataRow в моем коде. Потому что, когда им пытаются петлевого корыто своей базы данных MySQL и у меня есть Еогеасп так:Проблемы с C# datarow

foreach (DataRow row in _login._database) 

    { 

     //And search for Username and Pass that match 

     if (row.ItemArray[0].Equals(username) && row.ItemArray[1].Equals(password)) 

     { 

      _usernameTextBox.Text = String.Empty; 

      _passwordTextBox.Text = String.Empty; 

      MessageBox.Show("Login Success"); 

      break; 

     } 

     //If not, then show this message. 

     else 

     { 

      MessageBox.Show("Username/Password incorrect"); 

      break; 

     } 

    } 

Эта ошибка есть:

Error 1 Cannot convert type 'char' to 'System.Data.DataRow' 

Может кто-то помочь/объяснить мне, что им doeing неправильно.

Это остальная часть кода:

namespace Chat 
{ 
    public partial class StartupForm : Form 
    { 
     private LoginConnect _login = new LoginConnect(); 

     public StartupForm() 
     { 
      InitializeComponent(); 
      _login.OpenConnection(); 
     } 

     private void _loginButton_Click(object sender, EventArgs e) 
     { 
      string username = _usernameTextBox.Text; 
      string password = HashPass(_passwordTextBox.Text); 

      //Loop through database 

    foreach (DataRow row in _login._database) 

    { 

     //And search for Username and Pass that match 

     if (row.ItemArray[0].Equals(username) && row.ItemArray[1].Equals(password)) 

     { 

      _usernameTextBox.Text = String.Empty; 

      _passwordTextBox.Text = String.Empty; 

      MessageBox.Show("Login Success"); 

      break; 

     } 

     //If not, then show this message. 

     else 

     { 

      MessageBox.Show("Username/Password incorrect"); 

      break; 

     } 

    } 



      _login.LoginQuery(username, password); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var register = new RegisterForm(); 
      register.ShowDialog(); 
     } 

     public string HashPass(string password) 
     { 
      MD5 mdvijf = new MD5CryptoServiceProvider(); 

      //compute hash from the bytes of text 

      mdvijf.ComputeHash(ASCIIEncoding.ASCII.GetBytes(password)); 

      //get hash result after compute it 

      byte[] result = mdvijf.Hash; 

      StringBuilder strBuilder = new StringBuilder(); 

      for (int i = 0; i < result.Length; i++) 
      { 
       //change it into 2 hexadecimal digits 

       //for each byte 

       strBuilder.Append(result[i].ToString("x2")); 
      } 

      return strBuilder.ToString(); 


     } 

    } 
} 

LoginCOnnect.cs:

namespace Chat 
{ 


    class LoginConnect 
    { 
     private MySqlConnection _connection = new MySqlConnection(); 
     private string _server; 
     public string _database; 
     private string _uid; 
     private string _password; 
     //public String MessageRecieved; 
     private StringList _messagelist = new StringList(); 
     //private string _table = "logingegevens"; 
     private string _port; 
     //private bool succes = false; 


     public LoginConnect() 
     { 
      Initialize(); 
     } 


     public void Initialize() 
     { 
      _server = "localhost"; 
      _port = "3307"; 
      _database = "testlogin"; 
      _uid = "root"; 
      _password = "usbw"; 

      string connectionString = "Server=" + _server + ";" + "Port=" + _port + ";" + "Database=" + 
           _database + ";" + "Uid=" + _uid + ";" + "Pwd=" + _password + ";"; 

      _connection = new MySqlConnection(connectionString); 
     } 

     public bool OpenConnection() 
     { 
      try 
      { 
       _connection.Open(); 
       return true; 
      } 
      catch (MySqlException ex) 
      { 
       switch (ex.Number) 
       { 
        case 0: 
         MessageBox.Show("Cannot connect to server"); 
         break; 

        case 1042: 
         MessageBox.Show("Unable to connect to any of the specified MySQL hosts"); 
         break; 

        case 1045: 
         MessageBox.Show("Invalid username/password"); 
         break; 
       } 
       return false; 

      } 


     } 

     public void LoginQuery(string username, string password) 
     { 
      string loginquery = "SELECT * FROM logingegevens WHERE Username='" + username + "'AND Password='" + password + "';"; 

      try 
      { 

       MySqlCommand cmd = new MySqlCommand(loginquery, _connection); 

       MySqlDataReader dataReader = cmd.ExecuteReader(); 
       int count = 0; 
       while (dataReader.Read()) 
       { 
        count = count + 1; 
       } 
       if (count == 1) 
       { 
        MessageBox.Show("Login Succesfull"); 
       } 
       else if (count > 1) 
       { 
        MessageBox.Show("Acces denied"); 
       } 
       else 
       { 
        MessageBox.Show("Username or passowrd is not correct."); 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } 

    } 
} 
+0

Что такое тип '_login._database'? –

+0

Как вы можете видеть _login является приватным LoginConnect _login = new LoginConnect –

+0

Ans _database является общедоступной строкой в ​​LoginConnect –

ответ

0

Проблема заключается в том, что в этом заявлении

foreach (DataRow row in _login._database) 

вы перекручивание через string , и поэтому перечисление _login._database является IEnumerable из chars, а не DataRow, поэтому переменная row будет char, а не DataRow.

Я предлагаю вам извлечь данные во внутреннюю DataTable, код LoginConnect будет выглядеть так:

namespace Chat 
{  
    class LoginConnect 
    { 
     private MySqlConnection _connection = new MySqlConnection(); 
     private string _server; 
     public string _database; 
     private string _uid; 
     private string _password; 
     private StringList _messagelist = new StringList(); 
     private string _port; 
     private DataTable _dataTable; 

     public LoginConnect() 
     { 
      Initialize(); 
     } 

     public DataTable Data 
     { get { return _dataTable; } } 

     public void Initialize() 
     { 
      _server = "localhost"; 
      _port = "3307"; 
      _database = "testlogin"; 
      _uid = "root"; 
      _password = "usbw"; 

      string connectionString = "Server=" + _server + ";" + "Port=" + _port + ";" + "Database=" + 
           _database + ";" + "Uid=" + _uid + ";" + "Pwd=" + _password + ";"; 

      _connection = new MySqlConnection(connectionString); 
     } 

     public bool OpenConnection() 
     { 
      try 
      { 
       _connection.Open(); 
       return true; 
      } 
      catch (MySqlException ex) 
      { 
       switch (ex.Number) 
       { 
        case 0: 
         MessageBox.Show("Cannot connect to server"); 
         break; 

        case 1042: 
         MessageBox.Show("Unable to connect to any of the specified MySQL hosts"); 
         break; 

        case 1045: 
         MessageBox.Show("Invalid username/password"); 
         break; 
       } 
       return false; 
      } 
     } 

     public void LoginQuery(string username, string password) 
     { 
      string loginquery = "SELECT * FROM logingegevens WHERE Username='" + username + "'AND Password='" + password + "';"; 
      try 
      { 
       MySqlCommand cmd = new MySqlCommand(loginquery, _connection); 
       MySqlDataAdapter adp = new MySqlDataAdapter(cmd); 
       _dataTable = new DataTable(); 
       adp.Fill(_dataTable); 
       var count = _dataTable.Rows.Count; 
      } 
      catch{}//your handling 
     } 
    } 
} 

Таким образом, вы можете перебрать Data:

foreach (DataRow row in _login.Data.AsEnumerable()) 
+0

Но мне нужен datarow для row.ItemArray, Может быть, вы можете сказать мне другой optoin, который будет работать –

+1

Я редактировал Ответ –

+0

Спасибо, но у меня есть 2 ошибки. Это ошибки: 'Ошибка В текущем контексте имя' count 'не существует \t 'Ошибка Оператор foreach не может работать с переменными типа« System.Data.DataTable », потому что« System.Data. DataTable 'не содержит общедоступного определения для «GetEnumerator» –

0

Эта линия является неправильным: (DataRow row in _login._database т.к. _database - тип строки. Вам нужно перебирать что-то, что есть DataRow, как DataTable.

Во всяком случае я хотел бы изменить свой код на этот:

private void _loginButton_Click(object sender, EventArgs e) 
{ 
     string username = _usernameTextBox.Text; 
     string password = HashPass(_passwordTextBox.Text); 

     if (_login.LoginQuery(username, password)) 
     { 
      _usernameTextBox.Text = String.Empty; 
      _passwordTextBox.Text = String.Empty; 

      MessageBox.Show("Login Success"); 
     } 
     else 
     { 
      MessageBox.Show("Username/Password incorrect"); 
     } 
} 

и LoginCOnnect.cs метод LoginQuery вернуть bool

public bool LoginQuery(string username, string password) 
{ 
    string loginquery = "SELECT * FROM logingegevens WHERE Username='" + username + "'AND Password='" + password + "';"; 

    try 
    { 

     MySqlCommand cmd = new MySqlCommand(loginquery, _connection); 

     MySqlDataReader dataReader = cmd.ExecuteReader(); 
     int count = 0; 
     while (dataReader.Read()) 
     { 
      count = count + 1; 
     } 

     if (count == 1) 
     { 
      return true; 
     }       
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    return false;  
} 
+0

Спасибо за помощь, но у меня все еще есть smaal вопрос. В списке ошибок появляется ошибка: Chat.LoginConncet.LoginQuery (строка, строка) не все пути кода возвращают значение. Где я положил свое возвращение –

+0

Я упустил это. См. Мой отредактированный код 'LoginQuery'. – gzaxx

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