在我的《Winform开发框架》中,可使用多种数据库作为程序的数据源,除了常规的Oracle数据库、SqlServer、MySql数据库,其中还包括了SQLite数据库、Access数据库,后两个数据库都是在单机版程序中常用到的数据库,各自有着自己的特点,在我的《Winform开发框架》的提炼和多个项目的反复使用过程中,对SQLite数据库、Access数据库的一些特点进行了一些总结,以期达到常用常新,避免走弯路的目的。

1、简化数据库的地址,使用|DataDirectory|代替运行目录

可以使用这种|DataDirectory|的方式,这个是内置的.net目录,可以替代运行时刻的当前目录。

使用这个|DataDirectory|关键字有一点值得注意的地方,就是如果开发Asp.net的Web应用或者WCF服务应用,那么把数据库放到App_Data目录下,这是一个特殊的目录;如果是开发Winform程序,就是把数据库放到运行程序的根目录即可,不需要在创建App_Data了,因为Winform里,这个不是特殊目录,如果你创建了这样的目录,反而是画蛇添足了且不能正常运行。

使用这种方式,那么你构建的数据库连接方式就如下所示。

Access数据库的链接字符串:

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ComponentData.mdb;User ID=Admin;Jet OLEDB:Database Password=;"

Sqlite的链接字符串:

connectionString="Data Source=|DataDirectory|\ComponentData.db;Version=3;"

2、SQLite 数据导入的设置

SQLite 数据库管理有很多工具,我用过很多,总还是觉得SQLite Developer最为方便,除了创建新数据库、注册数据库、加密解密、查询修改表等、还支持各种数据库数据的导入操作,不过一般在使用数据的导入的时候,需要注意一些地方,否则可能会出现乱码或者不正确的地方。

SQLite Developer日期设置,在导入数据库前,我们一般需要设置该工具的一些属性。

导入数据后,显示的日期格式就会正常的了。

另外,如果现存的数据库(例如SQLServer数据库)中的字段为ntext(或者nvarchar(max))类型或者Access的memo类型的数据有中文的内容,导入到SQLite里面就会出现乱码现象,这个是一个比较头疼的事情。

如果字段内容不太大的话,那么可以把ntext(或者nvarchar(max))类型的字段修改为nvarchar(4000以下),然后使用SQLite Developer导入到Sqlite数据库里面,那么就正常显示中文。

如果内容比较大,除非使用更好的SQLite管理工具或者使用C#代码编写例子插入数据库内容,暂时还没有更好的办法。

3、SQLite语法内容

在使用SQLite的时候,你会发现它的语法既类似SQLServer,又有点类似MySql,又有些自己的特点。

SQL语法:

Select * From [Patient] where leavedate > date('2012-08-01') order by leavedate Limit 10,50

1)例如上面的语句,其中的[Patient]使用了"[]"作为限定符,默认正常的单词也可以不用,使用它的目的是为了防止和保留字、关键字同名的。

2)上面语句date('2012-08-01')或者datetime('2012-08-01 12:30:00')这样的格式,是为了对字符串进行转换为日期进行比较,如果没有使用这个date或者datetime关键字,那么数据库会实现字符串的对比,如果时间的格式不匹配,如日期里面存储的是2010-8-1这样的内容,而sql语句比较的时候,使用 leavedate >'2010-08-01' 的字符串进行比较就会出现逻辑上不正确了。

3)limit语法。使用limit进行分页比较简单,这个语句类似于MySql的语法,Limit 10,50 的意思是跳过10行,取50行的意思,返回50条记录。,Limit 10这是返回10条记录的意思。

4)在使用参数化语句的时候,SQLite数据库可以使用 @ 符号,也可以使用 $ 符号进行处理。

5)如果插入一条记录,想获取最后一条的返回自增长ID的话,那么使用语句 Select LAST_INSERT_ROWID()就可以获取到了。

4、Access和Sqlite数据库的链接字符串

Access2000/Access2003的链接字符串格式:

<add name="access2000" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WareHouse.mdb;User ID=Admin;Jet OLEDB:Database Password=;" />

Access2007的链接字符串格式(使用时候还需要安装AccessDatabaseEngine的数据库引擎):

<add name="access2007" providerName="System.Data.OleDb"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb;User ID=Admin;"/>

Sqlite数据库链接字符串:

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;" />

Sqlite数据库链接字符串(含加密密码):

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;Password=myPassword" />

5、Access的特殊语法

Access大多数的语法和SqlServer的语法一致,不过有一些比较特别一点。

1)参数化语句,Access也支持参数化的语句的,不过他们的顺序必须和参数出现的顺序一致,否则就会出错。

2)使用EnterpriseLibrary类库注意事项,Access参数化设置的时候,需要修改日期类型为OleDbType.Date。

                param[i] = new OleDbParameter("@" + field, val);
if (val is DateTime)
{
param[i].OleDbType = OleDbType.Date;//日期类型特别处理,否则Access数据库访问出错
}

3)获取最后插入的自增长ID,可以通过语句SELECT @@IDENTITY获得。

6、动态数据库字符串加密

我们知道,对于SQLite或者Access这些数据库,链接字符串里面的密码必须是未加密的明文,数据库链接才能被有效识别,而这样就不能很好的保护我们的数据库了。为了实现有效的数据库管理,可以对数据库加密(使用用户看不到数据库密码),而放置链接字符串的时候,我们没有放置密码部分,而在代码里面动态给数据库连接字符串进行加密(硬绑定密码),这种也是一个有效的方法,程序发布后,程序集里面的密码经过混淆加密,一般不可识别。例如我的Winform开发框架采用的动态追加数据库密码字符串的方法如下所示。

        #region 连接字符串加密

        /// <summary>
/// 根据配置数据库配置名称生成Database对象
/// </summary>
/// <returns></returns>
protected override Database CreateDatabase()
{
Database db = null;
if (string.IsNullOrEmpty(dbConfigName))
{
db = DatabaseFactory.CreateDatabase();
}
else
{
db = DatabaseFactory.CreateDatabase(dbConfigName);
} DbConnectionStringBuilder sb = db.DbProviderFactory.CreateConnectionStringBuilder();
sb.ConnectionString = GetConnectionString();
GenericDatabase newDb = new GenericDatabase(sb.ToString(), db.DbProviderFactory);
db = newDb; return db;
} /// <summary>
/// 动态改变或者连接字符串
/// </summary>
/// <returns></returns>
protected virtual string GetConnectionString()
{
string connectionString = "";
DatabaseSettings setting = ConfigurationManager.GetSection("dataConfiguration") as DatabaseSettings;
if(setting != null)
{
string defaultConnection = setting.DefaultDatabase;
connectionString = ConfigurationManager.ConnectionStrings[defaultConnection].ConnectionString; //尝试加密或者解密
if(!connectionString.EndsWith(";"))
{
connectionString += ";";
}
connectionString += string.Format("Jet OLEDB:Database Password=mypassword;");
} return connectionString;
} #endregion

以上就是一些关于SQLite数据库和Access数据库的使用经验总结,希望读者能够有所收获,并能够分享自己的经验总结,非常感谢您的阅读,如果有宝贵的意见可以留言告知。

使用SQLite数据库和Access数据库的一些经验总结的更多相关文章

  1. 将ACCESS数据库迁移到SQLSERVER数据库

    原文:将ACCESS数据库迁移到SQLSERVER数据库 将ACCESS数据库迁移到SQLSERVER数据库 ACCESS2000文件 用ACCESS2007打开,并迁移到SQLSERVER2005里 ...

  2. WPF应用Access数据库

    WPF应用Access数据库 现在Access数据库中有表GuestTable,其中的字段如下图所示,现在需要应用WPF技术为此表制作一个数据库管理窗口,实现对此数据库中的数据进行数据的增.删.改和查 ...

  3. 让ADO.NET Entity Framework 支持ACCESS数据库

    如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 接到一个程序和网页交互的项目,用ADO.NET ...

  4. ACCESS数据库注入

    0X01 我们想来了解一下access数据库 Access注入是暴力猜解 Access数据结构(access只有一个数据库) Access数据库 表名 列名 数据 没有库这个概念 只有表这个概念 这应 ...

  5. Access数据库及注入方法

    目录 Access数据库 Access数据库中的函数 盲注Access数据库 Sqlmap注入Access数据库 Access数据库 Microsoft Office Access是由微软发布的关系数 ...

  6. sqlserver,sqlite,access数据库链接字符串

    SqlServer:string connection = "server=32.1.1.48;database=数据库名;user=sa;password=sa2008"; ac ...

  7. C#对SQLite、Access数据库操作的封装,很好用的~

    1.对SQLite的封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  8. 【.net 深呼吸】连接Access数据库应注意的几点

    本地数据库可以有Y种选择,比如Sqlite.SQL Server Express.SQL Local DB.SQL Server CE.Access等,本文老周选用比较著名的Access本地数据库,在 ...

  9. 64位系统使用Access 数据库文件的彻底解决方法

    最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没 ...

随机推荐

  1. 解决 NDP40-KB2468871不能安装

    新机子 成功装了vs2010,然后装sql2012提示让装vs2012sp1,下载了sp1,装的时候,装到最后一个包NDP40-KB2468871的时候报错了 KB2468871安装失败 错误: Ex ...

  2. vim 光标按行移动

    记录一下: [ H/M/L ] 注意:这几个命令是大写的. 使用H/M/L这三个键,可以让光标跳到当前窗口的顶部.中间.和底部,停留在第一个非空字符上.H命令和L命令前也可以加一个数字,但数字的含义不 ...

  3. Windows下msysGit使用及相关配置

    Windows下msysGit使用 目前我们git通过ssh进行通信,所以需要你也安装ssh以及将ssh key发给我,省得每次都需要输入用户名和密码 1.创建工程目录 windows下进入msysG ...

  4. iOS中生成并导入基于Swift编程语言的Framework

    从iOS 8.0开始就引入了framework打包方式以及Swift编程语言.我们可以主要利用Swift编程语言将自己的代码打包成framework.不过当前Xcode 7.x在自动导入framewo ...

  5. embarcadero radstudio xe5 正式版 下载地址

    http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_win.iso

  6. XE6 FMX之控件绘制与显示

    中午,有个货随手买的2块钱的彩票,尼玛中了540块,这是啥子狗屎气运.稍微吐槽一下,现在开始正规的笔记录入.经常有朋友说为毛我的博客不更新了或者说更新的少了,为啥呢!一来自己懒了,没学习什么新的东西, ...

  7. Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)

    // //  ViewController.swift //  JieUITapGestureRecognizer // //  Created by jiezhang on 14-10-4. //  ...

  8. Spring Boot 之 HelloWorld详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “以前是人放狗看家,现在是狗牵着人散步” — 随笔 一.Spring Boot 自述 世界上最好 ...

  9. android-tools-adb

    sudo apt-get install android-tools-adbsudo apt-get install android-tools-fastboot

  10. Ext JS 6 入门学习资料大全(2016-12-14)

    现在 sencha touch已经升级为 Ext JS 6 了重新整理下资料 官方网站:https://www.sencha.com/ 在线文档:http://docs.sencha.com/extj ...