我正在开发一个必须在 Linux 上读取 Access 数据库 (.mdb) 的 C# 应用程序。我正在使用 Mono 来编译和运行应用程序。
假设我有一个在 Access 2013 中创建的测试数据库。它有一个表:TestTable,具有默认 ID 列和使用“长文本”类型创建的 testField1 列。我插入三行,其中 testField1 列的这些值是:“foo”、“bar”、“baz”。数据库保存为“Access 2002-2003 数据库 (*.mdb)”。
生成的数据库(名为 Test.mdb)被传输到我的 Linux 机器上。作为健全性检查,我可以在数据库上运行 mdb-export:
$ mdb-export Test.mdb TestTable
ID,testField1
1,"foo"
2,"bar"
3,"baz"
到目前为止,一切都很好。现在,假设我们有一个读取表的 testField1 列的 C# 程序:
using System;
using System.Data.Odbc;
class Program {
public static void Main(string[] args){
try {
OdbcConnection conn = new OdbcConnection("ODBC;Driver=MDBTools;DBQ=/path/to/Test.mdb");
conn.Open();
var command = conn.CreateCommand();
command.CommandText = "SELECT testField1 FROM TestTable";
var reader = command.ExecuteReader();
while(reader.Read()){
Console.WriteLine(reader.GetString(0));
}
} catch(Exception e){
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
}
我希望运行这个程序会打印“foo”、“bar”和“baz”。但是,编译和运行程序不会产生以下输出:
$ mcs mdb_odbc.cs -r:System.data.dll
$ mono mdb_odbc.exe
潦o
$ # this line added to show the empty lines
我的猜测是这是一个编码问题,但我不知道如何解决它。有没有办法修复我的程序或它运行的环境,以便正确打印数据库的内容?我认为这是 ODBC 或 MDBTools 的问题,因为在类似的程序中,针对数据库字段的字符串相等性检查失败。
我正在使用 Ubuntu 16.10。mono --version
输出Mono JIT compiler version 5.4.0.167 (tarball Wed Sep 27 18:38:59 EDT 2017)
(我使用此补丁从源代码构建它以修复 ODBC 的另一个问题)。通过Apt安装的MDBTools是0.7.1-4build1版本,和odbc-mdbtools包是同一个版本。
我知道我使用的工具和软件的组合是不寻常的,但不幸的是,我必须使用 C#,我可能必须使用 Mono,我必须使用 Access 数据库,并且我必须使用 ODBC 访问数据库. 如果没有其他方法,我想我可以将数据库转换为另一种格式(想到 SQLite)。