Команда чтения OleDbDataReader. ExecuteReader (); - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь написать простую форму входа в систему с доступом к базе данных.после того, как я нажму кнопку входа, он вернется к коду и пометит это:

OleDbDataReader reader = command.ExecuteReader ();

соединение успешно, но когда я нажимаю, войдите егоreturn.

имя базы данных: users1.mdb имя таблицы: DataData

изображение: https://imgur.com/a/gl2Xfga

в чем моя проблемас моим кодом?

</p> <pre>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.OleDb; namespace CDHW { public partial class Form1 : Form { private OleDbConnection connection = new OleDbConnection(); public Form1() { InitializeComponent(); connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\RBA\Desktop\123\users1.mdb; Persist Security Info=False;"; } private void Form1_Load(object sender, EventArgs e) { try { connection.Open(); checkConnection.Text = "Connection Successful"; connection.Close(); } catch (Exception ex) { MessageBox.Show("Error " + ex); } } private void groupBox1_Enter(object sender, EventArgs e) { } private void btn_Login_Click(object sender, EventArgs e) { connection.Open(); OleDbCommand command = new OleDbCommand(); command.Connection = connection; command.CommandText = "select * from DataData where User='" + text_Username.Text + "' and Password='" + text_Password.Text + "'"; OleDbDataReader reader= command.ExecuteReader(); int count = 0; while (reader.Read()) { count = count + 1; //count++; // } if (count == 1) { MessageBox.Show("Wellcome to G Tool"); } if (count == 1) { MessageBox.Show("Password is duplicated"); } else { MessageBox.Show("User Name or Password is incorrect"); } connection.Close(); } } }

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Попробуйте вместо этого использовать OleDbDataAdapter с DataTable.

    OleDbCommand command = new OleDbCommand();
    command.Connection = connection;
    command.CommandText = "select * ... ";
    DataTable zDataTable = new DataTable;
    OleDbDataAdapter zDataAdapter = new OleDbDataAdapter;
    zDataAdapter.SelectCommand = command;
    zDataAdapter.Fill(zDataTable);
    int RecordCount = DataTable.Rows.Count;

Таким образом, вам не придется перебирать все записи, чтобы получить количество записей.

0 голосов
/ 16 февраля 2019

Использование блоков гарантирует, что ваши объекты базы данных закрыты и расположены, даже если есть ошибка.Это обеспечивает очистку неуправляемых ресурсов, используемых этими объектами.

Вы можете передать строку соединения непосредственно в конструктор соединения.Аналогично, конструктор команды может принимать оператор sql и соединение.

Использовать перегрузку Parameters.Add, которая принимает имя параметра и тип данных.Это помогает нам понять, что значение параметра соответствует типу данных.

Поскольку мы использовали Count в операторе select, мы можем использовать ExecuteScalar и выводить только один фрагмент данных, а не всю запись.

Конечно, в реальном приложении вы НИКОГДА не будете хранить пароли в виде простого текста.

    private void button1_Click(object sender, EventArgs e)
    {
        int RetVal;
        using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\RBA\Desktop\123\users1.mdb;Persist Security Info=False;"))
        {
            using (OleDbCommand cmd = new OleDbCommand("Select Count(*) From DataData Where [user] = @User And [password] = @password;", connection))
            {
                cmd.Parameters.Add("@User", OleDbType.VarChar).Value = text_Username.Text;
                cmd.Parameters.Add("@Password", OleDbType.VarChar).Value = text_Password.Text;
                connection.Open();
                RetVal = (int)cmd.ExecuteScalar();
            }
        }
        if (RetVal == 1)
            MessageBox.Show("Welcome");
        else
            MessageBox.Show("Login incorrect");
    }

Почти забыли!С помощью поставщика OleDb параметры должны быть добавлены в коллекцию параметров в том же порядке, в котором они отображаются в операторе sql.Этот провайдер не будет соответствовать именам параметров.

0 голосов
/ 15 февраля 2019

Примечание: см. Комментарии, в которых экранируются User и Password.

Первое, что мы должны рассмотреть здесь: параметры.Прямо сейчас, если имя пользователя / пароль содержат диапазон символов, могут произойти очень плохие вещи;итак:

command.CommandText = "select * from DataData where [User]=@cn and [Password]=@pw";
command.Parameters.Add(new OleDbParameter("@cn", text_Username.Text));
command.Parameters.Add(new OleDbParameter("@pw", text_Password.Text));

Проблема следующая - это пароли в виде простого текста, но это огромная область - просто ... никогда не храните пароли в виде текста ... никогда.

Теперь я собираюсь предположить, что вышеприведенное не исправляет это;если это так, вам нужно проверить, как User и Password определены в базе данных.Сообщение об ошибке указывает на то, что одно из них не очень похоже на текст.

В этом коде также много проблем с using и т. Д., Которые могут привести к странным ошибкам, связанным с "открытый читатель "и т. д .;если возможно, я настоятельно рекомендую такой инструмент, как Dapper, который значительно облегчит получение правильного кода.Например:

var userIds = connection.Query<string>(
    "select [User] from DataData where [User]=@cn and [Password]=@pw",
    new { cn = text_Username.Text, pw = text_Password.Text }).AsList();
switch(userIds.Count) {
    case 0: // TODO: doesn't exist
    case 1: // TODO: perfect
        break;
    default: // TODO: oops, multiple users
        break;
}
...