SQLite3 与 NHibernate 在 .NET 程序中使用

SQLite3 与 NHibernate 在 .NET 程序中使用,第1张

概述SQLite 与 NHibernate 在 .NET 程序中使用 作者:终南   <li.zhongnan@hotmail.com> 1。抛弃Access 曾经在VB下作一个程序,为了简单起见,通过共享目录来实现多台机器访问Access数据库,最终却发现这是个噩梦,程序根本没有办法正常运行,不得已采用Mysql。 最近作一个单机桌面程序,想采用Access+NHibernate来实现对数据库的 *** 作

sqlite 与 NHibernate 在 .NET 程序中使用

作者:终南 <li.zhongnan@hotmail.com>

1。抛弃Access

曾经在VB下作一个程序,为了简单起见,通过共享目录来实现多台机器访问Access数据库,最终却发现这是个噩梦,程序根本没有办法正常运行,不得已采用MysqL。

最近作一个单机桌面程序,想采用Access+NHibernate来实现对数据库的 *** 作,初次试验便告失败,索性不去理它,转而采用sqlite。

2。相关软件

Hibernate是一个Java编写的非常优秀的数据访问框架,它彻底屏蔽了使用SQL语句对数据库的 *** 作,在Hibernate下,对数据库的 *** 作简化为成对象的 *** 作。NHibernate是Hibernate的.Net版本。当前NHibernate最新的稳定版本为1.2.1.GA,可以通 过以下页面选择下载:

www.hibernate.org/6.html

NHibernate包括.Net 1.1 和 .Net 2.0两个版本,以我们将要用到的2.0为例,解压下载后的软件得到以下我们需要用到的重要文件:

Castle.DynamicProxy.dll
IEsi.Collections.dll
log4net.dll
NHibernate.dll

sqlite是一个类似于Access的嵌入式、轻量级的小型数据库引擎,无数的软件或系统都采用sqlite作为数据库保存应用数据,如 firefox,Iphone等。与其它大多数sql数据库不同的是,sqlite没有独立的服务进程。sqlite直接读写原始的磁盘文件,一个拥有多个表、索引、触发 器和视图的完整sql数据库就包含在一个独立的磁盘文件中。数据库文件的格式是跨平台的,你可以在32位和64位系统之间、在不同的 *** 作系统之间自由地复 制数据库。sqlite目前最新的版本为3.5.7,在其他程序中使用sqlite时,需要sqlite的引擎文件sqlite3.dll。可以通过如下 网址下载sqlite:

http://www.sqlite.org/sqlite-3_5_7.zip

解压后,得到 sqlite3.exe 这样一个可执行文件,我们在命令行进入到解压后的目录,然后运行 sqlite3.exe test.db,进入 sqlite3 管理界面,然后执行SQL语句:

create table Users (ID integer,EmailAddress varchar(50),Username varchar(50),Password varchar(50));

创建一个下面例子要用到的表,然后输入.exit 退出。将会有一个名为test.db的文件被创建。

该文件包含一个sqlite命令行式的客户端程序,可以用来创建和访问sqlite数据库。

www.sqlite.org/sqlitedll-3_5_7.zip

解压该文件后,生成一个dll格式的sqlite引擎文件:sqlite3.dll

http://www.sqlite.org/cvstrac/wiki?p=ManagementTools

该页面列出了许多管理sqlite数据库的GUI程序,利用这些GUI程序,可以很方便、直观的创建和管理sqlite数据库。通过,一个sqlite数据库就是一个文件,如test.db,文件扩展名可以为任何值,一般为db或者db3。

要在.Net中使用sqlite,还需要一个针对sqlite的ADO.NET ProvIDer,可以通过以下网站下载:

http://sourceforge.net/projects/adodotnetsqlite

解压该文件会生成一个我们需要的文件:sqlite.NET.dll

4。在VS.NET 2005中练习一下

(1) 在VS.NET 2005中创建一个名为 NHibernateWithsqlite 的C#控制台工程。

(2)把以下文件复制到工程目录下:

Castle.DynamicProxy.dll
IEsi.Collections.dll
log4net.dll
NHibernate.dll
sqlite.NET.dll

sqlite3.dll
test.db

(3)将

Castle.DynamicProxy.dll
IEsi.Collections.dll
log4net.dll
NHibernate.dll
sqlite.NET.dll

添加为工程的引用。

(4)将 test.db 和 sqlite3.dll 添加到项目中。并且在文件属性中,将文件的“复制到输出目录”设置为“如果较新则复制”。

(5)修改Program.cs文件,将以下内容复制到Program.cs文件中:

using System;
using System.Diagnostics;
using log4net;
using NHibernate;
using NHibernate.Cfg;
using NHibernateWithsqlite;

namespace NHibernateWithsqlite
{

class Program
{

private const string TestemailAddress = "li.zhongnan@hotmail.com";
private const string TestPassword = "password";
private const string TestUsername = "username";

static voID Main(string[] args)
{

// ----------------------------------------
// Step 1: log4net configuration (optional)
// ----------------------------------------
log4net.Config.XmlConfigurator.Configure();


// ---------------------
// Step 2: Configuration
// ---------------------
Configuration configuration = new Configuration();
Console.Writeline("Configure NHibernate...");
configuration.Configure();
Console.Writeline("Loading mapPing files in this executable...");
configuration.AddAssembly(System.Reflection.Assembly.GetExecutingAssembly());


// --------------------------------
// Step 3: Create a Session Factory
// --------------------------------
ISessionFactory factory = configuration.BuildSessionFactory();


// ---------------------
// Test 1: Create a User
// ---------------------

int firstID;

using (ISession session = factory.OpenSession())
{

Console.Writeline("Saving a test User object to the database...");

User user = new User();
user.EmailAddress = TestemailAddress;
user.Password = TestPassword;
user.Username = TestUsername;

session.Save(user);
session.Flush();

firstID = user.ID;

Console.Writeline("The User object was assigned an ID of " + firstID + "!");

DeBUG.Assert(
firstID > 0,"The ID should have been returned.");
}


// ---------------------
// Test 2: Load the User
// ---------------------
using (ISession session = factory.OpenSession())
{

Console.Writeline("Attempting to reload User with ID " + firstID + "...");

User user = session.Load<User>(firstID);

DeBUG.Assert(
user.ID == firstID,
"The wrong ID fIEld was returned.");

DeBUG.Assert(
user.EmailAddress == TestemailAddress,
"The wrong EmailAddress was returned.");

DeBUG.Assert(
user.Password == TestPassword,
"The wrong Password was returned.");

DeBUG.Assert(
user.Username == TestUsername,
"The wrong Username was returned.");

Console.Writeline("The user was reloaded successfully!");

}


// -----------------------
// Test 3: Delete the User
// -----------------------
using (ISession session = factory.OpenSession())
{
Console.Writeline("Deleting the user...");
User user = session.Load<User>(firstID);
session.Delete(user);

try
{
Console.Writeline("Confirming the user record is deleted...");
User deletedUser = session.Get<User>(firstID);
throw new InvalIDOperationException("The load should not have succeeded.");
}
catch(ObjectDeletedException ex)
{
Console.Writeline(ex.Message);
}

session.Flush();
}

Console.Writeline("Done. Press Enter to exit...");
Console.Readline();

}
}
}

(6)在项目中添加一个User.cs文件,内容为:

using System;
using System.Collections.Generic;
using System.Text;

namespace NHibernateWithsqlite
{
public class User
{

private int ID;
private string emailAddress;
private string username;
private string password;


public virtual int ID
{
get
{
return this.ID;
}
set
{
this.ID = value;
}
}

public virtual string EmailAddress
{
get
{
return this.emailAddress;
}
set
{
this.emailAddress = value;
}
}

public virtual string Password
{
get
{
return this.password;
}
set
{
this.password = value;
}
}

public virtual string Username
{
get
{
return this.username;
}
set
{
this.username = value;
}
}

}
}

(7)添加一个 User.hbm.xml文件,内容为:

<?xml version="1.0" enCoding="utf-8" ?>
<hibernate-mapPing xmlns="urn:nhibernate-mapPing-2.2">
<class name="NHibernateWithsqlite.User,NHibernateWithsqlite" table="Users">

<ID name="ID" column="ID" type="int" unsaved-value="0">
<generator />
</ID>

<property name="EmailAddress" length="50" />
<property name="Username" column="Username" type="String" length="50"/>
<property name="Password" column="[Password]" type="String" length="50"/>

</class>
</hibernate-mapPing>

(8)在文件属性中,将该文件的“生成 *** 作”设置为“嵌入的资源”。

添加一个App.config文件,其内容为:

<?xml version="1.0" enCoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
<section name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/>
</configSections>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.release_mode">on_close</property>
<property name="connection.provIDer">NHibernate.Connection.DriverConnectionProvIDer</property>
<property name="connection.driver_class">NHibernate.Driver.sqliteDriver</property>
<property name="connection.connection_string">Data Source=test.db;Version=3</property>
<property name="dialect">NHibernate.Dialect.sqliteDialect</property>
<property name="query.substitutions">true=1;false=0</property>
</session-factory>
</hibernate-configuration>

<log4net>
<appender name="console"
type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern"
value="%d{absolute} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>

<appender name="fileAppender" type="log4net.Appender.fileAppender">
<file value="log-file.txt" />
<appendTofile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>

<root>
<level value="WARN" />
<appender-ref ref="console" />
<appender-ref ref="fileAppender" />
</root>
</log4net>

</configuration>

该文件为配置文件,用来配置NHibernate如何连接数据库,以及log4net。

(9)编译并运行

(10)祝贺您的程序成功运行

5。文件的目录结构

6。项目在资源管理器中的结构

总结

以上是内存溢出为你收集整理的SQLite3 与 NHibernate 在 .NET 程序中使用全部内容,希望文章能够帮你解决SQLite3 与 NHibernate 在 .NET 程序中使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存