C# 错误告诉我我没有';t关闭连接,但尚未';不是吗?

C# 错误告诉我我没有';t关闭连接,但尚未';不是吗?,c#,oledb,C#,Oledb,我一定错过了什么。我正在尝试创建一个表,但收到一个错误,告诉我连接仍然打开。但是在哪里???我已经重新阅读了代码,但我找不到连接仍然打开的位置 问题出在这里: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. pr

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

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

只有在尚未打开连接时,才应打开该连接。试试这个:

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

只有在尚未打开连接时,才应打开该连接。试试这个:

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

我不知道这是否适合你(从未使用过ADOX),但是:

tldr:


我不知道这是否适合你(从未使用过ADOX),但是:

tldr:


ADOX对象似乎也应该关闭它的连接。 请看以下来自Microsoft的示例:

他们的ADOX对象名为cat。 它们有以下特点:

cat.ActiveConnection = Nothing
这可能会转化为:

createMSFile.ActiveConnection = null
在代码中(可能在第一个Finally块中)。
我认为是ADOX对象起了作用,在释放它之前,尝试将它的ActiveConnection设置为null。

似乎ADOX对象也应该关闭它的连接。 请看以下来自Microsoft的示例:

他们的ADOX对象名为cat。 它们有以下特点:

cat.ActiveConnection = Nothing
这可能会转化为:

createMSFile.ActiveConnection = null
在代码中(可能在第一个Finally块中)。
我认为是Adox对象产生了差异,在删除之前,尝试将它的活动性设置为null。

< P>我必须承认,我认为ADO确实是针对C++和VB<强>不< /St>.NET技术。

引自

注意:ADO和ADO MD尚未在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对象创建表。

< P>我必须承认,我认为ADO真正是用于C++和VB<强>不< /St>.NET技术。

引自

注意:ADO和ADO MD尚未在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对象创建表。

您到底遇到了什么错误?逐字的还有<代码>使用块将使这一点更加清晰。您能发布准确的错误,最好也发布stacktrace吗?(如果不是,那么至少告诉我们错误消息似乎指的是哪一行。)@马克·格雷威尔♦: 更新了我的操作。你到底遇到了什么错误?逐字的还有<代码>使用块将使这一点更加清晰。您能发布准确的错误,最好也发布stacktrace吗?(如果不是,那么至少告诉我们错误消息似乎指的是哪一行。)@马克·格雷威尔♦: 更新了我的操作。语法不起作用。”ConnectionState.Open在当前状态下不存在。它存在,您必须使用System.Data包含
因此编译器知道
连接状态
。好吧,这仍然不能解决我的问题。语法不起作用。”ConnectionState.Open在当前状态下不存在。它存在,您必须使用System.Data包含
因此编译器知道
连接状态
。好吧,这仍然不能解决我的问题。我不知道如何从ADOX创建主键,所以我使用了OleDB。我主要使用adox创建我的空文件。然后使用OleDB创建一个表。我不知道如何从ADOX创建主键,所以我使用了OleDB。我主要使用adox创建我的空文件。然后使用OleDB创建一个表。是否也尝试直接调用垃圾收集器?链接页面上的那个家伙说使用GC.Collect();如果那不起作用,你也试着直接给垃圾收集器打电话吗?链接页面上的那个家伙说使用GC.Collect();如果这不起作用,这似乎很好,它关闭了连接。我想我忘了关闭活动连接。这看起来很好,它关闭了连接。我想我忘了关闭活动连接。