エラーは私が接続を閉じていないが、私はしていないと私に伝えますか?

私はここで何かを逃したに違いない。テーブルを作成しようとしていますが、接続がまだ開いているというエラーが表示されます。しかしここで???私はコードを再読しましたが、接続がまだ開いている場所を見つけることができません...

Problem lays here: objOleDbConnection.Open()

エラー:

You attempted to open a database that is already opened by user 'Admin' on machine 'machine'. Try again when the database is available.

private void sfdNewFile_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
   //Creating a ADOX object needed to create
   //new MS Access file.
    ADOX.Catalog createMSFile = new ADOX.Catalog();
   //Creating an object for a table.
    Table nTable = new Table();

   //Creating an object allowing me connecting to the database.
    OleDbConnection objOleDbConnection = new OleDbConnection();
    objOleDbConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
            "Data Source=" + sfdNewFile.FileName + ";Persist Security Info=False;Mode=12";
   //Creating command object.
    OleDbCommand objOleDbCommand = new OleDbCommand();
    objOleDbCommand.Connection = objOleDbConnection;

    try
    {
       //Created a new MS Access 2007 file with specified path.
        createMSFile.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
            sfdNewFile.FileName);

        objOleDbConnection.Open();
        objOleDbCommand.CommandText = "CREATE TABLE PersonalData (" +
            "[DataID] AUTOINCREMENT NOT NULL PRIMARY KEY ," +
            "[Type] VARCHAR(40) NOT NULL ," +
            "[URL] VARCHAR(40) NOT NULL ," +
            "[SoftwareName] VARCHAR(40) NOT NULL ," +
            "[SerialCode] VARCHAR(40) NOT NULL ," +
            "[UserName] VARCHAR(40) NOT NULL ," +
            "[Password] VARCHAR(40) NOT NULL";

        objOleDbCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
       //Displaying any errors that 
       //might have occured.
        MessageBox.Show("Error: " + ex.Message);
    }
    finally
    {
       //It is importnat to release COM object, in this very order
       //otherwise we eill end up with an error.
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(createMSFile);

       //Closing the connection to the database.
        objOleDbConnection.Close();
    }
}
1
最初はobjOleDbConnection.Open();
追加された 著者 HelpNeeder,
@Marc Gravell:私のOPを更新しました。
追加された 著者 HelpNeeder,
正確なエラー、および好ましくはスタックトレースを投稿できますか? (そうでない場合は、少なくとも、エラーメッセージがどの行に表示されているかを教えてください)。
追加された 著者 LukeH,
正確に何のエラーが表示されていますか?逐語的また、 using ブロックを使用すると、これをもっと明確にすることができます。
追加された 著者 Marc Gravell,

4 答え

It seems that the ADOX object should close its connection as well. Look at the following sample from Microsoft: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681562(v=vs.85).aspx

ADOXオブジェクトの名前はcatです。 彼らは以下を持っています:

cat.ActiveConnection = Nothing

おそらく次のように解釈されます:

createMSFile.ActiveConnection = null

あなたのコードで(おそらく最初のFinallyブロックに)。 私はそれをdispoingする前に、それがnullにActiveConnectionを設定しようとすると、違いを作るADOXオブジェクトだと思う。

3
追加された
これは素晴らしいと思われ、接続を閉じます。私はアクティブな接続を閉じることを忘れてしまったと思います。
追加された 著者 HelpNeeder,

私はADOがC ++とVBの .NET技術ではないと思っていたことを認めなければなりません。

To quote from here

注意ADOおよびADO MDは、Microsoft .NET Framework環境で完全にテストされていません。特にサービスベースのアプリケーションやマルチスレッドアプリケーションで断続的な問題が発生することがあります。この記事で説明する手法は、ADO.NETへの移行中の一時的な手段としてのみ使用してください。互換性の問題がないことを確認するために完全なテストを行った後にのみ、これらのテクニックを使用してください。この方法でADOまたはADO MDを使用することによって発生する問題はサポートされていません。詳細については、Microsoft Knowledge Baseの次の記事を参照してください。   840667 .NET FrameworkアプリケーションでADOおよびADO MDを使用すると予期しないエラーが発生する

同じページに次のコードが表示されます:

using System;
using ADOX;

namespace ConsoleApplication1
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            ADOX.CatalogClass cat = new ADOX.CatalogClass();

            cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" +
                   "Data Source=D:\\AccessDB\\NewMDB.mdb;" +
                   "Jet OLEDB:Engine Type=5");

            Console.WriteLine("Database Created Successfully");

            cat = null;

        }
    }
}

ADOXオブジェクトを使って何かを行う代わりに、代わりにOleDBCommandsを使用しようとしていることに私は注意します。 ADOXを使用する場合は、ADOXオブジェクトを使用してテーブルを作成する必要があります。

2
追加された
さて、私はADOXからプライマリキーを作成する方法を理解できなかったので、OleDBを使用しました。私は主に空ファイルを作成するためにadoxを使用しました。次に、OleDBを使用してテーブルを作成します。
追加された 著者 HelpNeeder,

まだ開かれていない場合にのみ、接続を開く必要があります。これを試して:

if (objOleDbConnection.State != ConnectionState.Open)
{
    objOleDbConnection.Open()
}
1
追加された
それは、 ConnectionState がコンパイラによって認識されるように、 System.Data; を使用して
追加された 著者 Fischermaen,
構文は機能しません。 'ConnectionState.Open'は現在の状態では存在しません。
追加された 著者 HelpNeeder,
さて、これはまだ私の問題を解決していません。
追加された 著者 HelpNeeder,

i don't know if this suits you (never used ADOX) but: http://www.pcreview.co.uk/forums/closing-access-file-created-adox-catalogclass-t1384766.html

tldr:

Marshal.ReleaseComObject(cat);
cat = null;
1
追加された
これは機能しません。私は同じエラーが発生します。
追加された 著者 HelpNeeder,
ガベージコレクタにも直接コールしようとしましたか?リンクされたページのその人はGC.Collect()を使用すると言っていました。それがうまくいかない場合
追加された 著者 fnurglewitz,