2016-08-18 2 views
-1

Вот мои MSacces:Войти система MSAccess ошибка komut.ExecuteReader() необработанное

enter image description here

Моя ошибка: я могу зарегистрироваться и войти в систему, но когда я начинаю программу еще раз, я не могу войти в систему с той же переменной.

Например: Я зарегистрировался с admin 123, а затем я вхожу в систему с admin 123. Затем я закрываю программу и открываю ее снова, я не могу войти в систему с admin 123.

Форма 1 начинается отсюда:

OleDbConnection bağlanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=üye.accdb"); 
    private void button2_Click(object sender, EventArgs e) 
    { 
     bağlanti.Open();//connection open 
     OleDbCommand komut = new OleDbCommand("select * From üyeler", bağlanti); 
     OleDbDataReader okuyucu = komut.ExecuteReader();//reader 



     while (okuyucu.Read())reader.read 
     { 
      if (textBox1.Text.ToString() == okuyucu["kullaniciadi"].ToString())//read[accountname] 
      { 
       if (textBox2.Text.ToString() == okuyucu["kullanicisifre"].ToString())//read[password] 
       { 

        MessageBox.Show("tebrikler giriş başarılı");//cong sign in sucseed 
        Form2 frm = new Form2();//going new form 
        frm.Show(); 
        this.Hide(); 
       } 
      }    
      else 
      { 
       MessageBox.Show("Bu kullanıcı adı şifresi yanlıştır"); 
      } 
     } 
     bağlanti.Close(); 
    } 

    private void uyeol_Click(object sender, EventArgs e) 
    { 
     Form3 frm = new Form3();//sign up button 
     frm.Show(); 
     this.Hide(); 
    } 
} 
} 

и его форма 3

OleDbDataAdapter da; 
    OleDbCommand cmd; 
    DataSet ds; 

    OleDbConnection bağlanti = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source =üye.accdb"); 

    void griddoldur() 
    { 
     bağlanti = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=okul.accdb");//con 
     da = new OleDbDataAdapter("select *from ogrenci", bağlanti); 
     ds = new DataSet(); 

    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     griddoldur(); 
    } 
     public void button1_Click(object sender, EventArgs e) 
    { 
     cmd = new OleDbCommand(); 

     bağlanti.Open();//connection open 
     cmd.Connection = bağlanti;//cmd = new OleDbCommand(); 
     cmd.CommandText="insert into üyeler (kullaniciadi,kullanicisifre,tel,ad) values ('"+textBox1.Text+"','"+textBox2.Text+"','"+textBox3.Text+"','"+textBox4.Text+"')";//(account name + textbox1)(passw+ textbox2)(phonenumber+textbox3)(Name + textbox 4) 
     cmd.ExecuteNonQuery();,//cmd = new OleDbCommand(); 
     bağlanti.Close();//connection close 

      Form1 frm = new Form1();//going log in form 
      frm.Show(); 
      this.Hide(); 

    } 
} 
+2

Извините, но ваш язык тарабарщился ко мне :(Не стесняйтесь взглянуть на [этот мета-пост] (http://meta.stackoverflow.com/questions/266563/do-non-english-words-увеличение-вероятность-прием-downvotes /) – nvoigt

+0

Когда у вас есть две записи в вашей таблице, остальные части kick говорят вам, что вы не можете войти (?), но на самом деле вы еще не закончили проверять вторую запись. Знаете ли вы, как использовать предложение WHERE в инструкции SQL? – Steve

+0

Единственное, что ясно из этого сообщения, это то, что оно открыто для SQL-инъекции. НИКОГДА НЕ СОХРАНИТЕ строки для SQL-запросы. Уточните, что означают слова, написанные на вашем языке, чтобы мы могли получить представление о том, что происходит (добавьте комментарии к коду) – Takarii

ответ

1

Чтобы правильно проверить, существует ли ваш пользователь + пароль использовать этот подход

private void button2_Click(object sender, EventArgs e) 
{ 
    string cmdText = @"select * From üyeler 
         where [email protected] 
         and [email protected]"; 
    using(OleDbConnection bağlanti = new OleDbConnection(.......)) 
    using(OleDbCommand komut = new OleDbCommand(cmdText, bağlanti)) 
    { 
     bağlanti.Open();//connection open 
     komut.Parameters.Add("@account", OleDbType.VarWChar).Value = textBox1.Text; 
     komut.Parameters.Add("@pass", OleDbType.VarWChar).Value = textBox2.Text; 
     using(OleDbDataReader okuyucu = komut.ExecuteReader()) 
     { 
      // Now with the WHERE clause if there are rows you have the login 
      if(okuyucu.HasRows) 
      { 
       MessageBox.Show("tebrikler giriş başarılı");//cong sign in sucseed 
       Form2 frm = new Form2();//going new form 
       frm.Show(); 
       this.Hide(); 
      } 
      else 
      { 
       MessageBox.Show("Bu kullanıcı adı şifresi yanlıştır"); 
      } 
     }    
    } 
} 

Этот запрос использует предложение WHERE позволяет вам искать базу данных, если есть запись с именем пользователя и паролем. Также обратите внимание, что я использовал параметризованный запрос, чтобы избежать ошибок синтаксического анализа и Sql Injections. Наконец, все одноразовые объекты должны быть заключены в блок-блок, чтобы уничтожить их, когда вы закончили работать с ними (в частности, объект OleDbConnection)

Есть еще одна вещь, чтобы сказать о вашем коде. Кажется, что вы сохраняете свои пароли в ясном тексте внутри базы данных. Это большая угроза безопасности, поэтому с базой данных Access, где каждый может просто скопировать/посмотреть файл и просмотреть все ваши пароли пользователей. Не делайте этого вместо этого, как искать store passwords in a database

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