因为现场的数据库用的还是 Visual FoxPro,而自己用的编程语言是C#,不能直接访问,在网上查了不少资料,最后终于在 DRL 找到了一个解决方法,DBF 数据库读取的问题就基本解决了。以下为解决这个问题过程中的一些笔记
1. 用 “Provider=Microsoft.Jet.OLEDB.12.0;” 时,提示如下错误:
An unhandled exception of type ‘System.InvalidOperationException‘ occurred in System.Data.dll
Additional information: 未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”提供程序。
而用 “Provider=Microsoft.ACE.OLEDB.12.0;” 时,则提示如下错误:
An unhandled exception of type ‘System.Data.OleDb.OleDbException‘ occurred in System.Data.dll
Additional information: 找不到可安装的 ISAM。
2. 之后根据 DRL 的回帖,用了下面的语句(Provider=VFPOLEDB.1),可以正常导入了。
代码出处:http://stackoverflow.com/questions/22361457/c-sharp-read-from-dbf-files-into-a-datatable
1 var yourResultSet = new DataTable(); 2 3 var yourConnectionHandler = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=C:\"); 4 5 yourConnectionHandler.Open(); 6 7 if (yourConnectionHandler.State != ConnectionState.Open) return; 8 const string mySql = "select JH,RCYL from dba04 Where JH like ‘7P10%‘"; // JH like ‘7P10%‘ 表示 JH字段中包含 ‘7P10‘,而百分号是模糊查询的意思 9 10 var myQuery = new OleDbCommand(mySql, yourConnectionHandler); 11 var da = new OleDbDataAdapter(myQuery); 12 13 da.Fill(yourResultSet); 14 15 yourConnectionHandler.Close();
经过测试, “Visual FoxPro” 和 “FoxBASE+/Dbase III plus, 无备注” 这两种格式的数据库,都可以用上面的语句正常导入,太赞了!
3. 在 Debug 模式下,Any CPU 和 x86 都可以正常导入;而在 Release 模式下Any CPU 就不能正常导入,需要改成 x86 才可以。因为要考虑到 SQLite 在 XP 机器上的应用,所以研究了一下 x86 的问题,还好测试了一下,果然发现问题了。
4. 在 XP 虚拟机中将 Visual FoxPro 卸载之后,再运行程序时提示 “The VFPOLEDB.1 provider is not registered on the local machine.”。重新安装一遍 Visual FoxPro 之后问题消失。
解决方案:最后提供软件的时候附上 Visual FoxPro 的安装程序,简单粗暴。