在C#中使用SQLITE,如何更新和使用生成的数据库文件?
题
我正在开发具有二进制文件格式的.NET(C#)应用程序。该计划是将二进制格式迁移到更容易维护的SQLite数据库文件。
我以前从未使用过,所以我有几个问题。
SQLITE的实现 http://sqlite.phxsoftware.com/ 包含一个LINQ提供商。我在本地玩过它,但是我必须以某种方式将其纳入一个开发人员可以使用的东西中。我可以将数据库文件放在PC上的文件夹中,该文件夹中包含在源存储库中,但最终应该在客户端AppData文件夹中。如何使用生成的数据库文件来实现此目标?当我手动创建数据库文件时,我可以轻松地告诉应用程序将其存储在哪里。
我对SQL查询有一个公平的了解,因此我的最初计划是创建一个库,该库使用SQL查询来对数据库进行数据库的端口。缺点是,当字段更改或添加时,我必须更新很多事情:数据库创建查询,数据库更新或更改查询,即DataModel。根据我的收集,我可以使用设计器创建一个数据库,但是当我的应用程序下个月更新到版本2时,我的数据库更改了,我想将用户的现有数据库迁移到新版本。我可以手动地编写更新查询并使用某种增量数据库计数器来检查此问题,但是使用生成的数据库如何工作?
因此,直接使用SQL查询是更好,更容易,更安全的,或者有人可以将我指向使用生成的数据库的不错的可用用例?
谢谢。
解决方案
对于您的第一个问题,我可以建议您在ASP.NET中进行应用程序或使用Web服务(第二个更适合您的目标)。对于网络服务,我认为您应该在这样的方法中编码会话:
...
[WebMethod]
public DataSet GetData(object id, string sessionId)
{
try
{
DataSet ds = null;
CUser user = Global.GetSession(sessionId);
lock
{
//Your code to get data from the database
}
return ds;
}
catch(Exception ex)
{
throw;
}
}
对于您的第二个问题,我建议使用Fluentnhibrenate。我用过了 流利的nhibrenate 并且很容易对数据库进行建模,甚至可以生成数据库。这只是用于配置SQLite实现的代码的一瞥;
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(
SQLiteConfiguration.Standard
.UsingFile("firstProject.db")
)
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<Program>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
// delete the existing db on each run
if (File.Exists(DbFile))
File.Delete(DbFile);
// this NHibernate tool takes a configuration (with mapping info in)
// and exports a database schema from it
new SchemaExport(config)
.Create(false, true);
}
你可以看到 Fluentnhibrenate Wiki页面 并且有此框架的介绍性实现。最后管理您的SQLite数据库,我建议您使用 SQLITE管理员.
其他提示
首先, System.Data.SQLite
首先实现Ado.net提供商。连接字符串的数据源是要操纵的文件,但是如果您尝试从多个位置访问SQLite的问题,您将遇到SQLite的问题。尽管有记录的方法与日记和锁定水平有关。
要在用户的PC上“创建” DB,您可以将空数据库存储在资源中,然后将其复制到位置,或打开新的DB并运行创建脚本以制作表格/等。
其次,停下来。如果您要超越ADO.NET的呼叫来抽象数据层,只需使用现有的DB抽象,就不要构建自己的数据层。
我建议 NHIBERNATE, ,也有SQLite的驱动程序!
我不确定我了解问题1.您的程序是否需要获取预生成的数据库文件并将其放入客户端的AppData文件夹中,或者您的程序首次运行时需要生成新数据库文件在客户端计算机上,然后将新生成的数据库文件存储在AppData文件夹中。
至于第二个问题,我不明白您要做什么。您能澄清和/或提供一个例子吗?