使用SQLite数据库和Access数据库的一些经验总结

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

在我的《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数据库的一些经验总结,如需转载请自行联系原博主。



目录
相关文章
|
23天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
163 0
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
149 2
|
5天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
1月前
|
关系型数据库 数据库 C++
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
|
1月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
38 0
|
1月前
|
SQL 存储 数据可视化
access sql 数据库,Access SQL
access sql 数据库,Access SQL
|
2月前
|
Java 数据库连接 数据库
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
|
2月前
|
开发框架 安全 .NET
某教程学习笔记(一):07、数据库漏洞(access注入)
某教程学习笔记(一):07、数据库漏洞(access注入)
18 0
|
2月前
|
SQL 数据库管理
sqlite语句order by两个字段同时排序处理
sqlite语句order by两个字段同时排序处理
19 0
|
2月前
|
SQL 关系型数据库 MySQL
Python中的数据库操作:SQLite与MySQL的连接
Python中的数据库操作:SQLite与MySQL的连接
112 0