数据库访问之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开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    
标签: 开发辅助

posted on 2012-01-18 21:37 伍华聪 阅读(1952) 评论(7) 编辑 收藏

评论

#1楼  回复 引用 查看   

很实用
2012-01-18 21:58 | IT鸟      

#2楼  回复 引用 查看   

顶一下

#3楼  回复 引用 查看   

支持一个
2012-01-19 12:56 | 执手泪眼      

#4楼  回复 引用 查看   

支持一个,伍哥的东西都很实用啊。
2012-01-19 13:26 | 南京.王清培      

#5楼[楼主]  回复 引用 查看   

引用南京.王清培:支持一个,伍哥的东西都很实用啊。

呵呵,感谢一直的支持,我的东西都来源于开发,所以实用,哈哈。
2012-01-19 14:51 | 伍华聪      

#6楼  回复 引用 查看   

sqlserver中也可以使用@@IDENTITY返回最近插入的自增值,与SCOPE_IDENTITY()作用域不同,SCOPE_IDENTITY()受限于当前作用域
2012-01-28 12:27 | 到最后      

#7楼[楼主]  回复 引用 查看   

引用到最后:sqlserver中也可以使用@@IDENTITY返回最近插入的自增值,与SCOPE_IDENTITY()作用域不同,SCOPE_IDENTITY()受限于当前作用域


这个我知道,不过由于可能存在触发器的情况,@@IDENTITY的返回值不准确的,一般正确的是使用SCOPE_IDENTITY()
2012-01-31 08:45 | 伍华聪      

导航

<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:676
关注:23

搜索

 

常用链接

最新随笔

我的标签

随笔档案(202)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 629355
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜