首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UCanAccess、IKVM和C#

UCanAccess、IKVM和C#
EN

Stack Overflow用户
提问于 2016-02-24 12:45:05
回答 1查看 851关注 0票数 3

我想让UCanAccess在C#工作。我正在使用Linux上的Mono开发MonoDevelop。我已经使用.jar将所需的.dll .NET文件转换为IKVM文件,如下所示:

代码语言:javascript
复制
ikvmc -target:library file.jar

然后,我在我的.dll项目中引用了转换的C#文件。下面是我引用的所有DLL:

  • ucanaccess-3.0.3.1.dll
  • hsqldb.dll
  • jackcess-2.1.3.dll
  • commons-logging-1.1.1.dll
  • commons-lang-2.6.dll
  • IKVM.OpenJDK.Core.dll
  • IKVM.OpenJDK.Jdbc.dll
  • IKVM.Runtime

我还将ucanaccess-3.0.3.1.jar、hsqldb.jar、jackcess-2.1.3.jar、commons 1.1.1.jar和Common-lang-2.6.jar放入了bin/Debug文件夹。

下面是我在Main中编写的C#代码:

代码语言:javascript
复制
//ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("commons-lang-2.6"));
//ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("commons-logging-1.1.1"));
//ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("jackcess-2.1.3"));
//ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("hsqldb"));
ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("ucanaccess-3.0.3.1"));

java.sql.Driver v_driver = (java.sql.Driver) java.lang.Class.forName("net.ucanaccess.jdbc.UcanaccessDriver, ucanaccess-3.0.3.1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").newInstance();
java.sql.Connection v_con = v_driver.connect("northwind.mdb", null);

//java.lang.Class.forName("org.hsqldb.jdbcDriver, hsqldb, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
//java.lang.Class.forName("net.ucanaccess.jdbc.UcanaccessDriver, ucanaccess-3.0.3.1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
//java.sql.Connection v_con = java.sql.DriverManager.getConnection("jdbc:ucanaccess://northwind.mdb");

java.sql.Statement v_st = v_con.createStatement();

java.sql.ResultSet v_res = v_st.executeQuery("select * from Categories");
java.sql.ResultSetMetaData v_resmd = v_res.getMetaData();

for (int i = 0; i < v_resmd.getColumnCount(); i++)
    Console.Write(v_resmd.getColumnLabel(i) + "|");
Console.WriteLine();

while (v_res.next())
{
    for (int i = 0; i < v_resmd.getColumnCount(); i++)
        Console.Write(v_res.getString(i) + "|");
    Console.WriteLine();
}

代码编译,当我试图执行时,下面是我得到的错误:

代码语言:javascript
复制
Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for net.ucanaccess.jdbc.UcanaccessDriver ---> java.lang.RuntimeException: org.hsqldb.jdbc.JDBCDriver
--- End of inner exception stack trace ---
at (wrapper managed-to-native) System.Runtime.CompilerServices.RuntimeHelpers:RunClassConstructor (intptr)
at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (RuntimeTypeHandle type) [0x00000] in <filename unknown>:0 
at IKVM.Internal.TypeWrapper.RunClassInit () [0x00000] in <filename unknown>:0 
at IKVM.NativeCode.java.lang.Class.forName0 (System.String name, Boolean initialize, java.lang.ClassLoader loader) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName0 (System.String , Boolean , java.lang.ClassLoader ) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName (System.String className, ikvm.internal.CallerID ) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName (System.String className) [0x00000] in <filename unknown>:0 
at Test.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for net.ucanaccess.jdbc.UcanaccessDriver ---> java.lang.RuntimeException: org.hsqldb.jdbc.JDBCDriver
--- End of inner exception stack trace ---
at (wrapper managed-to-native) System.Runtime.CompilerServices.RuntimeHelpers:RunClassConstructor (intptr)
at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (RuntimeTypeHandle type) [0x00000] in <filename unknown>:0 
at IKVM.Internal.TypeWrapper.RunClassInit () [0x00000] in <filename unknown>:0 
at IKVM.NativeCode.java.lang.Class.forName0 (System.String name, Boolean initialize, java.lang.ClassLoader loader) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName0 (System.String , Boolean , java.lang.ClassLoader ) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName (System.String className, ikvm.internal.CallerID ) [0x00000] in <filename unknown>:0 
at java.lang.Class.forName (System.String className) [0x00000] in <filename unknown>:0 
at Test.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0

我已经试过的评论行,但没有成功。

我是不是遗漏了什么?提前感谢!

编辑:

@jamadei是对的,我把所有的罐子都合并到一个罐子里,它成功了!下面是工作代码(注意列索引从1开始,而不是0):

代码语言:javascript
复制
ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.Load("ucanaccess-3.0.3.1"));
java.sql.Driver v_driver = (java.sql.Driver) java.lang.Class.forName("net.ucanaccess.jdbc.UcanaccessDriver, ucanaccess-3.0.3.1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").newInstance();

java.sql.Connection v_con = v_driver.connect("northwind.mdb", null);
java.sql.Statement v_st = v_con.createStatement();

java.sql.ResultSet v_res = v_st.executeQuery("select categoryid, categoryname, description from Categories");
java.sql.ResultSetMetaData v_resmd = v_res.getMetaData();

for (int i = 1; i <= v_resmd.getColumnCount(); i++)
    Console.Write(v_resmd.getColumnLabel(i) + "|");
Console.WriteLine();

while (v_res.next())
{
    for (int i = 1; i <= v_resmd.getColumnCount(); i++)
        Console.Write(v_res.getString(i) + "|");
    Console.WriteLine();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 11:18:42

您需要将所有jar合并到一个jar中,然后将其转换为dll。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35602606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档