當我試圖對我的OleDbConnection變數使用.Open()方法時,我得到了一個System.AccessViolationException錯誤。但是,令人困惑的是,當我在不同的計算機上運行我的代碼時,它似乎并沒有發生。
我的代碼是用于我希望在服務器上運行的服務。當我在個人電腦上運行它時,它似乎可以正常作業,但當我嘗試在服務器上運行它時,它拋出了 AccessViolationException 錯誤。
代碼版本:
代碼版本:
我在Windows 10上使用Visual Studios 2019用C#撰寫
。
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}"/span>, filePath);
try
{
//設定新的檔案。
catalog.Create(connectionString);
((ADODB.Connection)catalog.ActiveConnection).Close()。
conn = new OleDbConnection(connectionString)。
conn.Open(); // <-- 錯誤發生在這里。
// 寫入新檔案
WriteDataToFile(schema, conn)。
}
catch (Exception ex)
{
status = false。
}
finally; }
{
if (conn != null)
conn.Close()。
}
return status。
}
StackTrace:
到目前為止,我發現的最好的線索是這個帖子,但我對如何從這個起點出發有點朦朧。
uj5u.com熱心網友回復:
要以編程方式創建 Access 資料庫,請執行以下操作:
添加對 添加對 CreateAccessDatabase 使用: 以編程方式在Access資料庫中創建一個表: 添加using陳述句: CreateTableProduct: 資源: uj5u.com熱心網友回復: 問題的答案是,我的服務器缺少我個人電腦上的一些檔案,只需要安裝正確的檔案即可。
在這種情況下,缺少的部分是 Microsoft Access Database Engine 2016 Redistributable,我最終找到了這里。在我的服務器上運行該可執行檔案得到了所需的檔案,之后一切都正常了。
標籤:的參考。
Microsoft ADO Ext.6.0 for DDL and Security
public static string CreateAccessDatabase(span class="hljs-built_in">string fullyQualifiedAccessFilename, string dbPassword = "")?
{
string connectionString = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}", fullyQualifiedAccessFilename) 。
if (String.IsNullOrEmpty(fullyQualifiedAccessFilename))
{
throw new Exception("Error (CreateAccessDatabase) - Database filename is null or empty.") 。
}
if (!String.IsNullOrEmpty(dbPassword))
{
connectionString = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0};Jet OLEDB:Database Password='{1}'", fullyQualifiedAccessFilename, dbPassword)。)
}
//創建新實體。
ADOX.Catalog cat = new ADOX.Catalog()。
//創建Access資料庫。
cat.Create(connectionString)。
//關閉連接[/span
cat.ActiveConnection.Close()。
//釋放COM物件。
System.Runtime.InteropServices.Marshal.ReleaseComObject(cat)。
GC.Collect()。
cat = null;
return String.Format("Database created '{0}'", fullyQualifiedAccessFilename)。)
}
string result = string.Empty。
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Access Database 2000-2003 (*.mdb)|*.mdb|Access Database 2007 (*.accdb)|*.accdb"。
if (sfd.ShowDialog() == DialogResult.OK)
{
//創建Access資料庫。
result = CreateAccessDatabase(sfd.FileName);
}
usingSystem.Data.OleDb;
public static int CreateTableProduct(span class="hljs-built_in">string fullyQualifiedAccessFilename, string dbPassword = "")?
{
int result = 0;
string connectionString = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}"/span>, fullyQualifiedAccessFilename);
if (!String.IsNullOrEmpty(dbPassword))
{
connectionString = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0};Jet OLEDB:Database Password='{1}'", fullyQualifiedAccessFilename, dbPassword)。)
}
string sqlText = string.Empty。
sqlText = "CREATE TABLE Product" ;
sqlText = "(ID AUTOINCREMENT not null primary key," ;
sqlText = " Name varchar(50) not null," ;
sqlText = " Price currency, Quantity integer);";
using (OleDbConnection con = new OleDbConnection(connectionString))
{
//打開連接。
con.Open()。
using (OleDbCommand sqlCmd = new OleDbCommand(sqlText, con))
{
//執行命令。
result = sqlCmd.ExecuteNonQuery()。
}
}
return result。
}

