【发布时间】:2021-09-10 20:55:19
【问题描述】:
尝试对我的 OleDbConnection 变量使用 .Open() 方法时出现 System.AccessViolationException 错误。但是,令人困惑的是,当我在另一台计算机上运行我的代码时似乎不会发生这种情况。
我的代码用于我想在服务器上运行的服务。当我在我的个人计算机上运行它时它似乎可以正常工作,但是当我尝试在服务器上运行它时它会引发 AccessViolationException 错误。
代码版本:
-
我正在使用 C# 在 Windows 10 上使用 Visual Studios 2019 编写代码
-
OleDbConnection 来自“Assembly System.Data, Version=4.0.0.0”
-
ADOX 来自“Assembly Interop.ADOX, Version=2.8.0.0”, System.Runtime.InteropServices
-
ADODB 来自“Assembly Interop.ADODB, Version=2.8.0.0”, System.Runtime.InteropServices
我的代码:
internal static bool CreateMDB(MySchemaClass schema, string filePath)
{
OleDbConnection conn = null;
bool status = true;
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", filePath);
try
{
// Setup new file
catalog.Create(connectionString);
((ADODB.Connection)catalog.ActiveConnection).Close();
conn = new OleDbConnection(connectionString);
conn.Open(); // <-- Error occurs here
// Write to new file
WriteDataToFile(schema, conn);
}
catch (Exception ex)
{
status = false;
}
finally
{
if (conn != null)
conn.Close();
}
return status;
}
堆栈跟踪:
到目前为止我找到的最好的线索是this post,但我对如何从那个起点开始有点模糊。
【问题讨论】:
-
你创建了什么样的服务项目?
-
我见过
OleDbConnection.Open抛出的AccessViolationException 的唯一情况是一个完全损坏的mdb 文件。我的提示是,您的catalog对象没有被释放,并且新创建的 mdb 文件可能没有完全写入磁盘。尝试在 CreateMDB 方法中创建目录对象,关闭 ActiveConnection 并使用 Marshal.ReleaseComObject 释放catalog,然后再使用 OleDbConnection 打开数据库。
标签: c# ms-access access-violation