• 数据库访问之Sqlite的不同之处


    在我的Winform开发框架中,底层的数据访问支持多种不同的数据库,在数据库访问的开发过程中,发现Sqlite多数情况下,操作都和SqlServer或者说是和标准Sql差不多的。当然,Sqlite本身也有一些特殊的语句支持,本文主要根据自己的了解,以及在支持的Sqlite基类中的提炼,总结他们常用到的一些不同,以便以后查阅,并和大家分享讨论。

    在我的Winform开发框架中,是支持Sqlite等这样的数据库接入的,示例图如下所示。 

      

    现在根据我整理的一些特殊地方,和大家分享讨论: 

    1)特殊字符

    每种数据库,基本上在操作SQL语句中,都有自己的一些特殊的分隔符号,如防止和关键字重名的特殊引用字符,SqlServer是[], 这方面Sqlite也沿用这个。参数化语句的占位符,SqlServer和Access是@,Oracle是:,而Sqlite则支持$和@。

    2)获取返回刚刚插入的主键字段值(自增长)

    这种操作也是经常用到的,一般Sqlserver是用SELECT SCOPE_IDENTITY() 语句操作,Access用的是SELECT @@IDENTITY,Oracle由于用的是序列,所以是SELECT Seq_TestTable.Currval ID From Dual这样的操作,Sqlite呢,他也有自己的特殊语句了,就是:Select LAST_INSERT_ROWID() ,是不是比较容易记住呢。

    3)Limit语句使用

    在SqlServer中,我们常用Top语句来操作数据,以便获取必要的记录信息,这个在Sqlite不支持的,而它和MySql一样,是使用LIMIT语句来实现相同的效果,下面就是我Winform开发框架中,获取第一条记录和最后一条记录的基类方法,我在这里分享一下。

            /// <summary>
            
    /// 查找记录表中最旧的一条记录
            
    /// </summary>
            
    /// <returns></returns>
            public override T FindFirst()
            {
                string sql = string.Format("Select {0} From {1} Order by {2} ASC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField));
                T entity = null;

                Database db = CreateDatabase();
                DbCommand command = db.GetSqlStringCommand(sql);

                using (IDataReader dr = db.ExecuteReader(command))
                {
                    if (dr.Read())
                    {
                        entity = DataReaderToEntity(dr);
                    }
                }
                return entity;
            }

            /// <summary>
            
    /// 查找记录表中最新的一条记录
            
    /// </summary>
            
    /// <returns></returns>
            public override T FindLast()
            {
                string sql = string.Format("Select {0} From {1} Order by {2} DESC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField));
                T entity = null;

                Database db = CreateDatabase();
                DbCommand command = db.GetSqlStringCommand(sql);

                using (IDataReader dr = db.ExecuteReader(command))
                {
                    if (dr.Read())
                    {
                        entity = DataReaderToEntity(dr);
                    }
                }
                return entity;

            } 


    4、分页实现

    前面我介绍了一篇文章,介绍整合了Sqlite语句分页逻辑的分页控件,随笔名称是《Winform分页控件更新之集成Sqlite数据库分页》,其实Sqlite分页逻辑也不神秘,无非也是利用Limit语句实现所需要的记录获取,如下所示。

            /// <summary>
            
    /// 不依赖于存储过程的分页(SQLite)
            
    /// </summary>
            
    /// <param name="isDoCount">如果isDoCount为True,返回总数统计Sql;否则返回分页语句Sql</param>
            
    /// <returns></returns>
            private string GetSQLiteSql(bool isDoCount)
            {
                string sql = "";
                if (string.IsNullOrEmpty(this.strwhere))
                {
                    this.strwhere = " (1=1) ";
                }

                if (isDoCount)//执行总数统计
                {
                    sql = string.Format("select count(*) as Total from {0} Where {1} "this.TableOrSqlWrapper, this.strwhere);
                }
                else
                {
                    //SELECT * FROM 表名称 LIMIT M,N 
                    string strOrder = string.Format(" order by {0} {1}"this.fieldNameToSort, this.isDescending ? "DESC" : "ASC");

                    int minRow = pageSize * (pageIndex - 1);
                    int maxRow = pageSize * pageIndex;
                    sql = string.Format("select {0} from {1} Where {2} {3} LIMIT {4},{5}",
                        fieldsToReturn, this.TableOrSqlWrapper, this.strwhere, strOrder, minRow, maxRow);
                }

                return sql;

            } 

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    JDBC的使用流程
    typescript vscode /bin/sh: ts-node: command not found
    小程序打开app场景
    设置获取cookie,setCookie,getCookie
    解决IOS微信页面回退不刷新问题
    百度小程序添加编译
    百度小程序审核不通过,基础库问题
    Charles Mac 破解安装和证书安装成功抓包单个域名是unknown
    xhrFields实现跨域访问
    Mac上启动nginx报错:nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2325967.html
Copyright © 2020-2023  润新知