3

我正在开发一个必须在 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)。

4

0 回答 0