我一定在这里错过了什么。我正在尝试创建一个表,但我收到一个错误,告诉我连接仍然是打开的。但是哪里???我已经重新阅读了代码,但我无法找到连接仍在打开的位置......
问题出现在这里: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();
}
}
答案 0 :(得分:3)
似乎ADOX对象也应该关闭它的连接。 请查看以下Microsoft的示例: 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。
答案 1 :(得分:2)
我必须承认,我认为ADO真的适用于C ++和VB 而不是 .NET技术。
引用here
警告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对象创建表。
答案 2 :(得分:1)
您应该只在尚未打开的情况下打开连接。试试这个:
if (objOleDbConnection.State != ConnectionState.Open)
{
objOleDbConnection.Open()
}
答案 3 :(得分:1)
我不知道这是否适合你(从未使用过ADOX)但是: http://www.pcreview.co.uk/forums/closing-access-file-created-adox-catalogclass-t1384766.html
tldr:
Marshal.ReleaseComObject(cat);
cat = null;