小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

數(shù)據(jù)庫訪問之Sqlite的不同之處

 悟靜 2012-03-09

數(shù)據(jù)庫訪問之Sqlite的不同之處

在我的Winform開發(fā)框架中,底層的數(shù)據(jù)訪問支持多種不同的數(shù)據(jù)庫,在數(shù)據(jù)庫訪問的開發(fā)過程中,發(fā)現(xiàn)Sqlite多數(shù)情況下,操作都和SqlServer或者說是和標準Sql差不多的。當然,Sqlite本身也有一些特殊的語句支持,本文主要根據(jù)自己的了解,以及在支持的Sqlite基類中的提煉,總結他們常用到的一些不同,以便以后查閱,并和大家分享討論。

在我的Winform開發(fā)框架中,是支持Sqlite等這樣的數(shù)據(jù)庫接入的,示例圖如下所示。 

  

現(xiàn)在根據(jù)我整理的一些特殊地方,和大家分享討論: 

1)特殊字符

每種數(shù)據(jù)庫,基本上在操作SQL語句中,都有自己的一些特殊的分隔符號,如防止和關鍵字重名的特殊引用字符,SqlServer是[], 這方面Sqlite也沿用這個。參數(shù)化語句的占位符,SqlServer和Access是@,Oracle是:,而Sqlite則支持$和@。

2)獲取返回剛剛插入的主鍵字段值(自增長)

這種操作也是經(jīng)常用到的,一般Sqlserver是用SELECT SCOPE_IDENTITY() 語句操作,Access用的是SELECT @@IDENTITY,Oracle由于用的是序列,所以是SELECT Seq_TestTable.Currval ID From Dual這樣的操作,Sqlite呢,他也有自己的特殊語句了,就是:Select LAST_INSERT_ROWID() ,是不是比較容易記住呢。

3)Limit語句使用

在SqlServer中,我們常用Top語句來操作數(shù)據(jù),以便獲取必要的記錄信息,這個在Sqlite不支持的,而它和MySql一樣,是使用LIMIT語句來實現(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、分頁實現(xiàn)

前面我介紹了一篇文章,介紹整合了Sqlite語句分頁邏輯的分頁控件,隨筆名稱是《Winform分頁控件更新之集成Sqlite數(shù)據(jù)庫分頁》,其實Sqlite分頁邏輯也不神秘,無非也是利用Limit語句實現(xiàn)所需要的記錄獲取,如下所示。

        /// <summary>
        
/// 不依賴于存儲過程的分頁(SQLite)
        
/// </summary>

        
/// <param name="isDoCount">如果isDoCount為True,返回總數(shù)統(tǒng)計Sql;否則返回分頁語句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)計

            {
                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;

        } 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多