zoukankan      html  css  js  c++  java
  • 使用SQLite数据库和Access数据库的一些经验总结

    在我的《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数据库的使用经验总结,希望读者能够有所收获,并能够分享自己的经验总结,非常感谢您的阅读,如果有宝贵的意见可以留言告知。

  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/3244417.html
Copyright © 2011-2022 走看看