为什么是 SQLite?

在以前的程序中, 我通常会使用 MySQL. 
如果使用你程序的用户是一个软件小白, 而且远在另一个城市, 那么让她安装和部署 MySQL 将是一场噩梦:

  • 她需要配置服务, 面对一系列莫名其妙的参数, 端口, 环境变量, 等等.
  • 她需要启动服务, 这个过程非常漫长, 而且很可能服务无法启动. 尤其是重装了 MySQL 之后, 服务死活起不来的情况很常见.
  • 她需要执行你的脚本初始化数据库, 而这个脚本很可能因为环境等问题没法运行.
  • 她可能需要导出数据, 便于给你定位错误.
  • 她需要迁移数据, 如果数据库规格发生变化的话.就算是你给她编写了迁移工具, 要正确运行通常也不简单.
    ...
    而使用 SQLite, 上述这些问题都不存在:
  • 不需要安装, 也没有服务, 就是一个文件而已.
  • 不需要初始化数据库, 你可以将做好之后再发布给她.
  • 不需要导出数据, 直接把文件发给你就可以了.
  • 不需要让用户自己迁移数据, 你可以让她把数据库文件发给你, 迁移好之后再发回去

为什么是 PetaPoco?

http://www.toptensoftware.com/petapoco/
用过 NHibernate 的人都会被它的配置感到厌恶吧, 而且因为框架庞太复杂, 学习的成本也比较高.
而 PetaPoco 是一个轻量级的 ORM 框架. 真的很轻量: 它只有PetaPoco.cs一个文件. 
不需要复杂的配置, 不需要安装, 只需要将 PetaPoco.cs 加入到你的项目中即可.
它没有对数据库的访问作过多的包装, 你可以很方便的执行原生 SQL 语句, 然后得到你要的类对象.
因此你可以很自由的使用它, 并且效率相当优异.

为什么还有 django?

是的, 你没有看错, 我说的是 python 的 web 开发框架 django.
它和C#以及桌面开发没有半毛钱关系. 使用它是因为它优秀的ORM, 以及内置的 SQLite 支持.
PetaPoco 没有自动生成数据库表格的功能, 而手工创建表格,添加字段的方式,效率实在太低下.
借助 django, 你可以定义数据模型, 然后 manage.py syncdb 一下, 就可以得到对应的数据库表格了.
后期的开发中, 你也可以使用 python 方便的对数据进行各种操作.

一点小麻烦

现在, 你可以用django轻松的得到建立好的sqlite数据库. 
PetaPoco 可以支持通过执行 T4 模版, 从数据库表格来生成对应的 C# 类. 
但很遗憾, 目前支持的数据库中还没有 SQLite.
现在, 你需要手工建立类.

注意事项

自定义表名

在django中定义models时, 默认的表名是app_model的格式. 这不太符合 C# 的命名习惯, 你可以通过 Meta 自定义:

# -*- coding: utf- -*-
from django.db import models
class User(models.Model):
username = models.CharField()
password = models.CharField()
class Meta:
db_table = 'User'

在开发环境中使用 SQLite

在 C# 中使用 SQLite, 你需要安装 SQLite 的 .NET 驱动.
这里我使用的是 dotConnect for SQLite Standard (Free)
http://www.devart.com/dotconnect/sqlite/download.html
安装了它之后, 当你在 Properties 的 Settings 中设置连接字符串时, 就可以找到 SQLite Database (dotConnect for SQLite) 的数据提供程序了. 
此外, 你需要在 Preferences 中添加对 Devert.Data 以及 Devert.Data.SQLite 的引用.

SQLite 的部署

在用户的电脑上, 你可以让她安装dotConnect for SQLite Standard (Free)来支持 SQLite
不过, 让用户安装东西通常会带来反感或麻烦. 你也可以什么都不用装, 只需要:
将下列 dll 与你的 exe 放在一起:

  • Devart.Data.SQLite.dll
  • Devart.Data.dll
  • antlr.runtime.dll
  • sqlite3.dll

在你的 app.config 中添加数据提供程序配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="SharpLite.Properties.Settings.SQLite" connectionString="Data Source=sqlite.db"
providerName="Devart.Data.SQLite" />
</connectionStrings> <system.data>
<DbProviderFactories>
<remove invariant="Devart.Data.SQLite" />
<add name="dotConnect for SQLite" invariant="Devart.Data.SQLite" description="Devart dotConnect for SQLite" type="Devart.Data.SQLite.SQLiteProviderFactory, Devart.Data.SQLite" />
</DbProviderFactories>
</system.data> </configuration>

这个配置很关键, 它能让你的程序找到上述 dll 中的数据提供程序.
如果你没有配置它, 用户点击了你的exe后, 你的程序将运行不起来, 也没有任何错误提示. 
如果不知道原因, 这会是一件相当让人抓狂的事. 
我今天就遇到了, 折腾了好久都没找到原因:( 
最后不得已, 我在需要部署的电脑上安装了 vs2008, 并运行代码, 这才发现问题. 真是欲哭无泪啊T_T!!!

建立数据连接

你可以建立如下的类作为数据库的全局入口:

using PetaPoco;
namespace SharpLite
{
class DbAccess
{
private static Database m_instance = null;
public static Database GetInstance()
{
if (m_instance == null)
{
m_instance = new Database("SharpLite.Properties.Settings.SQLite");
}
return m_instance;
}
}
}

这里用到了 app.config 中定义的连接字符串属性, 也就要用到 System.configuration 模块.
你需要在 Preferences 添加对它的应用, 否则编译会无法通过.

PetaPoco 的编译条件

PetaPoco 中用到了 C# 的动态特性, 例如 var 关键字(C# 3.0 引入), 以及 Dynamic 空间(C# 4.0 引入).
像我使用的是 .NET 3.5, 支持 var 关键字没问题, Dynamic 空间则不行. 编译时出现如下错误:

Error      The type or namespace name 'Dynamic' does not exist in the namespace 'System' (are you missing an assembly reference?)
D:\workspace\SharpLite\SharpLite\PetaPoco.cs SharpLite

好在我并不需要为此升级到 .NET 4, PetaPoco 代码中提供了条件编译开关, 用以避免使用 Dynamic 特性.
你只需在项目属性 -> Build -> General -> Confitional compilation symbols 后面的文本框中加入 PETAPOCO_NO_DYNAMIC 即可.
注意 Debug 和 Release 要分别设置.

如果你仍然在使用 .NET 2.0, 那么很遗憾, var 关键字都不支持, PetaPoco 没法使用了. 
这个方案也不适用于你了. 不过, 我还是真诚的建议你: 升级吧

C#/Sqlite-SQLite PetaPoco django 打造桌面程序的更多相关文章

  1. 用 Python+nginx+django 打造在线家庭影院

    用 Python+nginx+django 打造在线家庭影院 2018年11月29日 08:46:59 清如許 阅读数:1528   我喜欢看电影,尤其是好的电影,我会看上三四遍,仔细感受电影带给我的 ...

  2. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  3. 2018.2最新-Scrapy+elasticSearch+Django打造搜索引擎(二)

    请问您今天要来个引擎吗? 工欲善其事必先利其器 最终项目上线演示地址: http://search.mtianyan.cn 第二节:我们搞搞比利,搞搞环境的搭建.Github地址: https://g ...

  4. 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)

    这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...

  5. 关于xfce桌面程序启动失败

    当双击桌面图标的时候,出现如下错误信息:Process org.xfce.FileManager exited with status 1 于是做出如下尝试: 1. ps aux | grep Fil ...

  6. 用node-webkit(NW.js)创建桌面程序

    以往写windows桌面程序需要用MFC.C#之类的技术,那么如果你只会web开发技术呢?或者说你有一个网站,但是你想把你的网站打包成一个桌面应用程序,该如何做呢? 答案就是用node-webkit这 ...

  7. web桌面程序之图标拖动排序的分析

    在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...

  8. 在.net桌面程序中自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 ...

  9. 突破短板,传统桌面程序 使用webapi 扩展迎合web和移动端融合的需求

    传统桌面程序不能完全被web和移动端替代,但是需要改造.这里要说的是巧用webapi把以前用dll和com组件,ocx等方式做接口,做分布式开发的方式,改成restful 风格api的方式实现跨平台, ...

随机推荐

  1. 很好用的谷歌字体以及Gravatar头像一键替换WordPress插件----WP Acceleration for China 插件

    WordPress总是被新上手的朋友诟病说速度慢,其实多半都要归功于谷歌字体的功劳.在应对字体这个问题的时候,大家都会有各种不同的解决方案.今天我给大家推荐一款插件,它集合了多个替代方案,可以方便的替 ...

  2. NOI2014 魔法森林 day1t2 SPFA

    这道题做法还是很多的,至少有人用最优性剪枝当场A掉了.我只有50分的暴力分(写丑了),SB我不会LCT,先写一下SPFA的神思路做法(说白了还是我SB),LCT以后定补.ORZ想出来的人(hq大神). ...

  3. 使用python获取网易云音乐无损音频教程

    博客园主页:http://www.cnblogs.com/handoing/ github项目:https://github.com/handoing/get-163-music 环境:Python ...

  4. cssBase.css你应该有一个

    @charset "utf-8"; /*! * @名称:base.css * @功能:1.重设浏览器默认样式 * 2.设置通用原子类 */ /* 防止用户自定义背景颜色对网页的影响 ...

  5. Django2.x版本在生成数据库表初始化文件报错

    1.待创建的表信息 from django.db import models # Create your models here. class Book(models.Model): name=mod ...

  6. Openstack 清除openstack网络与路由 (十七)

    一)清除openstack网络与路由 “清除openstack网络与路由”和”添加openstack网络与路由”的操作步骤相反. 添加网络或路由时是先建 搭建网络>搭建子网>建立端口, 而 ...

  7. codeforces 某套题s : surf(贪心 || 动态规划)

    题目: Now that you’ve come to Florida and taken up surfing, you love it! Of course, you’ve realized th ...

  8. Qt不同版本编译器,调用VC++生成的动态链接库

    今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下 http://qiusuoge.com/12720.html Qt如何调用VC++生成的动态链接库?假设当 ...

  9. phpstorm如何进行文件或者文件夹重命名

    1.phpstorm的重构 1.1重命名 在phpstorm中,右键点击我们要进行修改的文件,然后又一项重构,我们就可以进行对文件的重命名. 接下来点击重命名进行文件或者文件夹的重新命名. 在框中输入 ...

  10. 洛谷P1491 集合位置 [最短路,SPFA]

    题目传送门 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记 ...