Могу ли я узнать, почему эта ошибка? Соединение не было закрыто. Текущее состояние соединения открыто. ' Показано? - PullRequest
0 голосов
/ 13 января 2019
       public partial class Form1: Form
       {
           OleDbConnection con = new OleDbConnection();
           OleDbCommand cmd = new OleDbCommand();

       public Form1()
       {
            InitializeComponent();

       }

        private void label1_Click(object sender, EventArgs e)
        {

        }  

    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        con.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0;Data 
                                Source= Assignment.accdb";
        con.Open();




    }

    private void radioButton3_CheckedChanged(object sender, EventArgs e)
    {

    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void button1_Click(object sender, EventArgs e)
    {

    }

    private void button1_Click_1(object sender, EventArgs e)
    {

        con.Open();
        OleDbCommand cmd = new OleDbCommand();
        cmd.Connection = con;
        cmd.CommandText = "select * from SignUp where Username = '" + 
                           textBox1.Text + "' and Password= '" + 
                           textBox2.Text + "'";
        OleDbDataReader dr = cmd.ExecuteReader();
        int count = 0;
        while (dr.Read())
        {
            count++;
        }
        if (count ==1 )
        {
            MainMenu menu = new MainMenu();
            menu.Show();
            this.Close();
        }
        else
        {
            MessageBox.Show("Incorrect Username or Password");
        }

        con.Close();

Может кто-нибудь помочь мне проверить мой код Как исправить эту ошибку? Соединение не было закрыто. Текущее состояние соединения открыто. '

хотя я закрыл соединение

** сообщение Соединение не было закрыто. Текущее состояние соединения - open.is показано в (con.open (); [private void button1_Click_1])

Ответы [ 2 ]

0 голосов
/ 13 января 2019

вы пытаетесь открыть одно и то же соединение в двух функциях: private void Form1_Load(object sender, EventArgs e) и private void button1_Click_1(object sender, EventArgs e)

Просто удалите con.Open(); форму private void Form1_Load(object sender, EventArgs e)

0 голосов
/ 13 января 2019

Это может быть из-за того, что this.Close(); закрывает форму перед выполнением последней строки или потому что вы открываете соединение в нескольких местах.

  • Удалите эти строки кода из события Form1_Load и используйте , используя операторы , чтобы создать соединение именно тогда, когда вам это нужно, что также должно очистить ресурсы (и закрыть соединения) для вас, независимо от того, что (даже если выдается исключение).
  • Кроме того, всегда старайтесь параметризировать ваши запросы .
  • Так как вы ожидаете только одну возвращенную запись (или ничего, если имя входа неверно), вы можете использовать ExecuteScalar , чтобы упростить ситуацию еще больше.

Вот модифицированная версия вашего кода:

using (var con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Assignment.accdb"))
{
    con.Open();

    using (var cmd = new OleDbCommand())
    {
        cmd.Connection = con;
        cmd.CommandText = "select * from SignUp where Username = @user and Password = @pass";
        cmd.Parameters.Add(new OleDbParameter("@user", textBox1.Text));
        cmd.Parameters.Add(new OleDbParameter("@pass", textBox2.Text));

        var result = cmd.ExecuteScalar();

        if (result == null)
        {
            MessageBox.Show("Incorrect Username or Password");
            return;
        }

        MainMenu menu = new MainMenu();
        menu.Show();
        this.Close();
    }
}
...