数据库访问之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;
}