打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DbEntry on Mono 测试

DbEntry on Mono 测试

  Mono 2.6 发行,.Net 兼容性得到很大提高,据说甚至很多 WinForm 的程序,也可以不修改的编译运行成功了。

  Mono 有一个 Mono 兼容性检测工具,叫做 MoMA,我用 MoMA 检测了 DbEntry 生成的 dlls,结果显示,有两个地方不兼容,一个是 Mono 不支持 OleDB,一个是 Mono 不支持 ODBC。当然,这是一个很合理的结果,Linux 上根本就没有 OleDB 和 ODBC 嘛。

  不过,具体兼容性怎么样,还是需要实际测试一下。

  一开始,我使用 Ubuntu 9.10 来安装 Mono 和 MonoDevelop,发现,如果你安于使用 Ubuntu 缺省提供的版本,还是可以的,如果你想安装最新版本的 Mono 和 MonoDevelop,还真是需要费不少力气。所以最后还是决定使用 openSUSE,它和 Mono 都是 Novell 出的,在 Mono 和 MonoDevelop 的下载页,都直接有 openSUSE 的版本,安装起来方便不少,比如 MonoDevelop 中对于 boo 和 vala 的支持,在 Ubuntu 里需要自己先安装好,而在 openSUSE 里,它会自动安装。

  然后,直接把 DbEntry 的 dlls 和 System.Data.SQLite.dll 复制到项目目录里,程序就是最基本的 CRUD。

  在运行中发现两个问题:
   1.System.Data.SQLite.dll 会出错,这个在预料之中,因为 System.Data.SQLite.dll 使用的是 Managed C++ 和 Unmanaged C++ 混合编程的方式,在 Linux 下出错也是应该的。
   2.抽象 Init 函数出错,说是非法的 IL ret,这个我倒是有印象,在当时反编译 DbEntry 生成的程序集的时候,发现对于 Init 函数,我多 Emit 了一个 ret,.Net 没抱怨,Mono 抱怨了。

  对于第二个问题,作为测试,暂时可以先不用 Init 函数,对于第一个问题,试着改用 Mono 提供的 Sqlite provider,程序得以运行成功。

  配置文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Lephone.Settings" type="Lephone.Util.Setting.NameValueSectionHandler, Lephone.Util" />
</configSections>
<Lephone.Settings>
<add key="AutoCreateTable" value="true" />
<add key="DataBase" value="@SQLite : @~Test.db" />
<add key="DbProviderFactory" value="Mono.Data.Sqlite.SqliteFactory, Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
</Lephone.Settings>
</configuration>

  程序如下:

代码
using System;
using Lephone.Data.Definition;

namespace testdb
{
public abstract class User : DbObjectModel<User>
{
public abstract string Name { get; set; }
public abstract int Age { get; set; }

public abstract User Init(string name, int age);
}

class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine (
"Create....");
var u
= User.New;
u.Name
= "tom";
u.Age
= 20;
u.Save();
Console.WriteLine (u);
Console.WriteLine ();

Console.WriteLine (
"Read....");
var u1
= User.FindById(u.Id);
Console.WriteLine (u1);
Console.WriteLine ();

Console.WriteLine (
"Update....");
u1.Name
= "jerry";
u1.Age
= 11;
u1.Save();
Console.WriteLine (u1);
Console.WriteLine ();

Console.WriteLine (
"Delete...");
u1.Delete();
Console.WriteLine (User.FindById(u1.Id)
== null ? "{null}" : "{not null}");
Console.WriteLine ();
}
}
}

  运行结果:
Create....
{ Id
= 1, Name = tom, Age = 20 }

Read
....
{ Id
= 1, Name = tom, Age = 20 }

Update
....
{ Id
= 1, Name = jerry, Age = 11 }

Delete
...
{null}

  其实,这个结果有些超乎我的预期了,本来我还以为,也许我需要移除对于 OleDB 和 ODBC 引用的部分,并且使用 Mono 编译 DbEntry 的源程序才行,结果是,DbEntry 没有任何修改,直接使用 VS 编译的 dlls,程序就成功运行了。。。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Linux centos安装nat123
C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
求三阶行列式的值
1-1/2+1/3-1/4+1/5-………+1/99-1/N
C# 数字补零
C# Global::
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服