错误告诉我没有't关闭连接,但没有't我

本文关键字:连接 错误 告诉我 | 更新日期: 2023-09-27 18:15:47

我一定错过了什么。我正在尝试创建一个表,但我得到一个错误,告诉我连接仍然打开。但是在哪里? ?我已经重新阅读了代码,但我找不到连接仍然打开的地方…

问题在这里: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();
    }
}

错误告诉我没有't关闭连接,但没有't我

看起来ADOX对象也应该关闭它的连接。看看以下来自微软的例子:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681562 (v = vs.85) . aspx

它们的ADOX对象命名为cat。它们有以下内容:

cat.ActiveConnection = Nothing

这可能会翻译成:

createMSFile.ActiveConnection = null

在您的代码中(可能在第一个Finally块中)。我认为这是ADOX对象,使差异,处置它之前,尝试设置它的ActiveConnection为null。

我必须承认,我认为ADO实际上是为c++和VB 而不是 . net技术准备的。

从这里引用

注意ADO和adomd还没有在microsoft.net Framework环境中完全测试过。它们可能会导致间歇性问题,特别是在基于服务的应用程序或多线程应用程序中。本文中讨论的技术只应作为迁移到ADO.NET期间的临时措施。只有在进行了完整的测试以确保不存在兼容性问题之后,才应该使用这些技术。不支持以这种方式使用ADO或ADO MD所引起的任何问题。有关详细信息,请参阅Microsoft知识库中的以下文章: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对象创建表。

您应该只打开尚未打开的连接。试试这个:

if (objOleDbConnection.State != ConnectionState.Open)
{
    objOleDbConnection.Open()
}

我不知道这是否适合你(从未使用过ADOX),但是:http://www.pcreview.co.uk/forums/closing-access-file-created-adox-catalogclass-t1384766.html

tldr:

Marshal.ReleaseComObject(cat);
cat = null;