隐藏

C#开发winform解决Access连接 accdb 不可识别的数据库格式

发布:2022/12/15 14:05:37作者:管理员 来源:本站 浏览次数:993

在Access07之前的数据库后缀名均为*.mdb 而连接字符串写成Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myFolder\*.mdb ;Persist Security Info=False;


但是Access07和Access10将后缀名改为了*.accdb。而通过上述连接的话就会报出"不可识别的数据库格式"异常。


需要注意的是Microsoft.Jet.OLEDB.4.0的Oledb的连接方式是比较老的连接方式,而07以后的Oledb连接方式将改成Microsoft.ACE.OLEDB.12.0。


改后的连接变成了Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\*.accdb;Persist Security Info=False;


小窍门:


在asp.net中经常把连接字符串写在web.config中。但是access的连接字符串是需要数据库的绝对位置。即 盘符:/文件夹/文件 这样就导致经常把文件拷贝后需要改路径的问题。其实完全可以通过程序来获得数据库文件的绝对路径。具体如下:


web.config中只写数据库文件名 (一般会把数据库文件放在App_Data文件夹下,因为有一定的安全性)


<appSettings>

    <add key="ConnString" value="App_Data\ManageDB.accdb"/>

</appSettings>


然后在DBHelper类获得字符串的写上如下方法:


public static string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + AppDomain.CurrentDomain.BaseDirectory + ConfigurationSettings.AppSettings["ConnString"];


通过AppDomain.CurrentDomain.BaseDirectory来获得此数据库的绝对路径.

实例:

System.Exception
  HResult=0x80131500
  Message=不可识别的数据库格式 'E:\ejk5\git\zybw\zybw\WinSitemap\bin\Debug\db\db.accdb'。
  Source=Maticsoft.DBUtility
  StackTrace:
   在 Maticsoft.DBUtility.DbHelperOleDb.Query(String conn, String SQLString) 在 E:\ejk5\git\zybw\zybw\DBUtility\DbHelperOleDb.cs 中: 第 328 行
   在 WinSitemap.Form1.Form1_Load(Object sender, EventArgs e) 在 E:\ejk5\git\zybw\zybw\WinSitemap\Form1.cs 中: 第 24 行
   在 System.Windows.Forms.Form.OnLoad(EventArgs e)
   在 System.Windows.Forms.Form.OnCreateControl()
   在 System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   在 System.Windows.Forms.Control.CreateControl()
   在 System.Windows.Forms.Control.WmShowWindow(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   在 System.Windows.Forms.Form.WmShowWindow(Message& m)
   在 System.Windows.Forms.Form.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)