Не правильно закрывает соединение Odbc

У меня есть простое тестовое приложение Windows Forms. Первый раз запускаю в VS все работает. Если я немедленно запустил его снова, он выдаст исключение о защищенной от чтения памяти в файле adapter.fill(ds); линия. Если я подожду минут 5 или около того, приложение снова запустится. Я хотел бы получить совет от сообщества stackru о том, где я нахожусь с головой. Я полагаю, это какое-то время ожидания соединения. Код следует:

C#

    public void Button1_Click(object sender, EventArgs e)
    {
        string connectionString = @"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=x:\CMSBak\ISP;";

        var conn = new OdbcConnection(connectionString);

        conn.Open(); // Open the connection

        string strQuery = "SELECT * FROM ISPINMAS";

        var adapter = new OdbcDataAdapter(strQuery, conn);

        var ds = new DataSet();

        try
        {
            adapter.Fill(ds);
        }
        catch (Exception)
        {
            conn.Close();
            throw;
        }

        DataTable dt = ds.Tables[0];

        dataGridView1.DataSource = dt.DefaultView;

        conn.Close(); // That's it, now close the connection
    }

2 ответа

Решение

Как обычно одноразовый предмет (OdbcConnection) следует утилизировать, когда вам это больше не нужно.
Использование оператора будет очень полезно в этом сценарии

    DataSet ds = new DataSet();
    using(OdbcConnection conn = new OdbcConnection(connectionString))
    {
        conn.Open(); // Open the connection
        string strQuery = "SELECT * FROM ISPINMAS";
        var adapter = new OdbcDataAdapter(strQuery, conn);
        adapter.Fill(ds);
    }
    // At this point the connection is closed and dispose has been called to 
    // free the resources used by the connection
    DataTable dt = ds.Tables[0];
    dataGridView1.DataSource = dt.DefaultView;
    // No need to close the connection here

Также обратите внимание, что я удалил из вашего кода try / catch, потому что вы ничего не пытаетесь там обработать. Вы только что закрыли соединение, но оператор using сделает это и в случае исключений.

Я нашел работу вокруг. Вместо этого используйте OledB и провайдера Microsoft.Jet.OLEDB.4.0. Больше не нужно беспокоиться о блокировке файлов.

    string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=X:\CMSBak\ISP;Extended Properties=dBASE IV;User ID=Admin;Password=;";
    DataSet ds = new DataSet();
    using(OleDbConnection conn = new OleDbConnection(connectionString))
    {
        conn.Open(); // Open the connection
        string strQuery = "SELECT * FROM ISPINMAS";
        var adapter = new OleDbDataAdapter(strQuery, conn);
        adapter.Fill(ds);
    }
    // At this point the connection is closed and dispose has been called to 
    // free the resources used by the connection
    DataTable dt = ds.Tables[0];
    dataGridView1.DataSource = dt.DefaultView;
    // No need to close the connection here
Другие вопросы по тегам