0

簡単なテスト Windows フォーム アプリケーションがあります。VSで初めて実行すると、すべてが機能します。すぐにもう一度実行すると、adapter.fill(ds); で読み取り保護されたメモリに関する例外がスローされます。ライン。5分ほど待つと、アプリが再び実行されます。どこで頭がおかしくなっているのかについて、stackoverflow コミュニティからのアドバイスをお願いします。それは私が推測するいくつかの接続タイムアウトです。コードは次のとおりです。

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
    }
4

2 に答える 2

6

いつものように、使い捨てオブジェクト ( OdbcConnection) は、不要になったときに破棄する必要があります。using ステートメント
は、 このシナリオで非常に役立ちます

    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 ステートメントは例外の場合にもそれを保証します。

于 2013-03-29T21:17:41.283 に答える
0

回避策を見つけました。代わりに OledB と Microsoft.Jet.OLEDB.4.0 Provider を使用してください。ファイルロックの心配はもうありません。

    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
于 2013-04-03T23:01:41.303 に答える