數(shù)據(jù)庫(kù)訪問之Sqlite的不同之處在我的Winform開發(fā)框架中,底層的數(shù)據(jù)訪問支持多種不同的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)訪問的開發(fā)過程中,發(fā)現(xiàn)Sqlite多數(shù)情況下,操作都和SqlServer或者說是和標(biāo)準(zhǔn)Sql差不多的。當(dāng)然,Sqlite本身也有一些特殊的語(yǔ)句支持,本文主要根據(jù)自己的了解,以及在支持的Sqlite基類中的提煉,總結(jié)他們常用到的一些不同,以便以后查閱,并和大家分享討論。 在我的Winform開發(fā)框架中,是支持Sqlite等這樣的數(shù)據(jù)庫(kù)接入的,示例圖如下所示。
現(xiàn)在根據(jù)我整理的一些特殊地方,和大家分享討論: 1)特殊字符 每種數(shù)據(jù)庫(kù),基本上在操作SQL語(yǔ)句中,都有自己的一些特殊的分隔符號(hào),如防止和關(guān)鍵字重名的特殊引用字符,SqlServer是[], 這方面Sqlite也沿用這個(gè)。參數(shù)化語(yǔ)句的占位符,SqlServer和Access是@,Oracle是:,而Sqlite則支持$和@。 2)獲取返回剛剛插入的主鍵字段值(自增長(zhǎng)) 這種操作也是經(jīng)常用到的,一般Sqlserver是用SELECT SCOPE_IDENTITY() 語(yǔ)句操作,Access用的是SELECT @@IDENTITY,Oracle由于用的是序列,所以是SELECT Seq_TestTable.Currval ID From Dual這樣的操作,Sqlite呢,他也有自己的特殊語(yǔ)句了,就是:Select LAST_INSERT_ROWID() ,是不是比較容易記住呢。 3)Limit語(yǔ)句使用 在SqlServer中,我們常用Top語(yǔ)句來操作數(shù)據(jù),以便獲取必要的記錄信息,這個(gè)在Sqlite不支持的,而它和MySql一樣,是使用LIMIT語(yǔ)句來實(shí)現(xiàn)相同的效果,下面就是我Winform開發(fā)框架中,獲取第一條記錄和最后一條記錄的基類方法,我在這里分享一下。 /// <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、分頁(yè)實(shí)現(xiàn) 前面我介紹了一篇文章,介紹整合了Sqlite語(yǔ)句分頁(yè)邏輯的分頁(yè)控件,隨筆名稱是《Winform分頁(yè)控件更新之集成Sqlite數(shù)據(jù)庫(kù)分頁(yè)》,其實(shí)Sqlite分頁(yè)邏輯也不神秘,無非也是利用Limit語(yǔ)句實(shí)現(xiàn)所需要的記錄獲取,如下所示。 /// <summary>
/// 不依賴于存儲(chǔ)過程的分頁(yè)(SQLite) /// </summary> /// <param name="isDoCount">如果isDoCount為True,返回總數(shù)統(tǒng)計(jì)Sql;否則返回分頁(yè)語(yǔ)句Sql</param> /// <returns></returns> private string GetSQLiteSql(bool isDoCount) { string sql = ""; if (string.IsNullOrEmpty(this.strwhere)) { this.strwhere = " (1=1) "; } if (isDoCount)//執(zhí)行總數(shù)統(tǒng)計(jì) { 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; } |
|