1

とにかく、C# にはかなり新しいですが、私が書いたこの Initialise メソッドがあります。これは基本的に、MS2007 Access データベースへの接続を作成し、いくつかのクエリの結果である 4 つの DataTables で DataSet を埋めます。

    public frmDBCompareForm()
    {
        ///
        /// Required for Windows Form Design support
        ///
        InitializeComponent();
        frmDBCompareForm_Initialize();

        //
        // TODO: Add any constructor code
        //
        if (_InstancePtr == null) _InstancePtr = this;
    }

そして、入力されている DataTables の 1 つを含む、Initialise メソッドの開始:

private void frmDBCompareForm_Initialize()
    {
        // Fill DataSet with 3 DataTables, these tables will be 
        // made up of the from sQuery.
        try
        {
            // Create a new DataSet
            DataSet dsSite1 = new DataSet();
            // Set up the connection strings to HCAlias.accdb
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\HCAlias.accdb;Persist Security Info=False;";
            con.Open();
            //
            // Table 1 - dtSite1Name [cmbSite1]
            //
            dtSite1Name = new DataTable();
            string sQuery = "SELECT SourceName From Sites";
            OleDbCommand cmdSite1Name = new OleDbCommand(sQuery, con);
            OleDbDataAdapter myDASite1Name = new OleDbDataAdapter(cmdSite1Name);
            myDASite1Name.Fill(dsSite1, "dtSite1Name");
            cmbSite1.DataSource = dtSite1Name;
            cmbSite2.DataSource = dtSite1Name;

誰かが私が持っている方法でこれを行うための正しい方向に私を向けることができますか? その接続の問題を解決するためのヒントやアドバイスはありますか? 私はボスのようにグーグルをしてきましたが、私が抱えている正確な問題を見つけることができないようです.

4

2 に答える 2

3

また、接続を閉じる必要があります。次のように finally ブロックにも追加します。

        using (var con = new OleDbConnection())
        {
            con.Open();
            using (var cmd = new OleDbCommand("sqlquery", conn))
            {

                try
                {
                             //do Stuff here
                }
                catch (OleDbException)
                {

                    throw;
                }

            }
         }

よろしく

于 2011-06-27T01:37:28.940 に答える
2

このエラーは、接続を開いたままにしておくことが原因です。必ずしもすぐに発生するとは限りませんが、常に同じ数のリクエストの後に発生します。

IDisposable db クラスを using ステートメントでラップすることをお勧めします。

using (OleDbConnection con = new OleDbConnection())
{

}

これにより、Dispose() メソッドの実装が自動的に呼び出され、接続が閉じられます。

MSDN から: 「using ステートメントにより、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Dispose が呼び出されることが保証されます。オブジェクトを try ブロック内に配置してから、finally ブロックで Dispose を呼び出すことで、同じ結果を得ることができます。実際、これが using ステートメントがコンパイラによって変換される方法です。」...だから、最後にtry catchは必要ありません

于 2011-06-27T01:14:56.593 に答える