0
回答
数据库访问之Sqlite的不同之处
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

在我的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;

        } 

 

 

 


原文链接:http://www.cnblogs.com/wuhuacong/archive/2012/01/18/2325967.html
<无标签>
举报
长平狐
发帖于5年前 0回/62阅
顶部