[開發筆記]-sqlite數據庫在使用時遇到的奇葩問題記錄


有時候做些簡單的項目一般都會選擇sqlite數據庫,優點有很多,這里就不詳細說了。

在此主要記錄一些平時在使用時遇到的問題及解決方法。希望能對大家有所幫助。

-------------------------------------------------------------------------

一:sqlite一直提示 the database file is locked

解決:

-----------------------------------------------------------------------------

二:錯誤提示-混合模式程序集是針對v2.0........

解決:

------------------------------------------------------------------

三:在IIS中發布網站程序時,如果操作系統是64位的,有時候會出現訪問錯誤的問題,這時可以將應用程序高級設置中的“啟用32位應用程序”設置項改為True,再測試是否成功。(如果“啟用32位應用程序項為True” 時網站提示下面的錯誤黃頁,則可以將該項設置為False試試看。2014-5-24 更新:今天在測試一個網站時,發現在True的情況下網站報錯,則將該項切換為了False,則可以訪問了。至於如何來解釋這種問題,待研究。)

 

 

這種情況的一種錯誤現象是:

在IIS中發布使用sqlite數據庫的網站項目時,配置好IIS后訪問,頁面可能就是顯示下面的:

這時就需要你去修改應用程序池的模式了:

 

---------------------------------------------------------------------------

 四:使用sql語句插入當前時間

在sqlserver中,如果在操作數據時需要插入當前時間的情況,可以使用 GETDATE() 來插入,而在sqlite中則不同:

 

INSERT INTO MWaitPlayList(Msongid,Mtitle,Mauthor,Mtime) VALUES(@songid,@title,@author,datetime('now', 'localtime'))

 

要用 datetime('now','localtime') 來插入。

 

項目實例:

 

 #region 將歌曲添加到待播放列表中 /// <summary> /// 將歌曲添加到待播放列表中 /// </summary> /// <param name="songid">歌曲id</param> /// <param name="songtitle">歌曲名</param> /// <param name="songauthor">歌手</param> /// <returns></returns> public static bool XMusicAddtoWaitList(long songid, string songtitle, string songauthor) { string sql = "INSERT INTO MWaitPlayList(Msongid,Mtitle,Mauthor,Mtime) VALUES(@songid,@title,@author,datetime('now','localtime'))"; SQLiteParameter[] parameter ={ new SQLiteParameter("@songid",DbType.Int64), new SQLiteParameter("@title",DbType.String,200), new SQLiteParameter("@author",DbType.String,200) }; parameter[0].Value = songid; parameter[1].Value = songtitle; parameter[2].Value = songauthor; int row = ZXSQLiteHelper.ExecuteSql(sql, parameter); if (row > 0) { return true; } else { return false; } } 

 

-------------------------------------------------------------------------

 五. 數據庫配置

Web.Config或App.Config文件中的設置:

 <appSettings>
    <add key="SQLiteConn" value="Data Source=|DataDirectory|\Music.db;Version=3;Pooling=False;Max Pool Size=100;"/>
  </appSettings>

數據庫文件要放在App_Data文件夾中:

 

-------------------------------------------------------------------------

 六. SQLite中獲取最新添加自增ID,last_insert_rowid()的使用

今天在用sqlite數據庫時,想要在新插入數據的同時獲取自增的id值,從網上找了找,發現可以用last_insert_rowid() 這個函數來獲取,但是在sql語句中執行時卻一直返回0。於是又在網上找到了一個相關的文章,經測試可行。遂記錄一下。

  出現上面所提問題的主要原因是“last_insert_rowid()” 函數必須要和insert語句一起使用,說的再明白點,就是必須是由同一個“SQLiteConnection” 來操作。

修改后的sqliteHelper :

        /// <summary>
        /// 執行插入語句,並獲取最新的一條數據的id
        /// </summary>
        /// <param name="SQLString"></param>
        /// <param name="cmdParms"></param>
        /// <returns></returns>
        public static long ExecuteGetInsertId(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    long result = 0;
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        //result = cmd.ExecuteNonQuery();
                        //查詢 select用executeScalar() ,如果用executeNonQuery返回的永遠是1. 這里由於肯定能轉換為數字 ,所以可以直接轉換
                        result = Convert.ToInt64(cmd.ExecuteScalar());
                        cmd.Parameters.Clear();

                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        result = -1;
                        throw new Exception(E.Message);
                    }
                    return result;
                }
            }
        }

sql語句:

 string sql = "INSERT INTO UMembers(QId,UName,UPwd,UEmail,UPhoto,UTime) VALUES (5,@uname,@upwd,@uemail,@uphoto,datetime('now','localtime'));SELECT last_insert_rowid() from UMembers";

                          -----------------------------------

參考:

今天在我的數據類中給Add方法完善一下.想要實現添加之后返回添加的實體的自增ID,遂想起了select last_insert_rowid(),可是用了之后就是不好使,各種返回0,

后來經度娘指教,我發現一句話"在同一個SQLiteConnection中...",原來如此.修改代碼,搞定!

 

我之前是這么寫的

DBHelperSQLite.ExecuteSql(sql,parameters);
return Convert.ToInt32(DBHelperSQLite.GetSingle("select last_insert_rowid()"));

注意:由於我的DBHelper寫法的原因,這樣的話就變成了兩個SQLiteConnection

改進后

return DBHelperSQLite.ExecuteSql(sql+ ";select last_insert_rowid();", parameters);

DBHelper修改

public static int ExecuteSql(string SQLString, List<SQLiteParameter> para)
    {
        using (SQLiteConnection connection = new SQLiteConnection(connectionString))
        {
            using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
            {
                try
                {
                    connection.Open();
                    foreach (SQLiteParameter p in para)
                    {
                        cmd.Parameters.Add(p);
                    }
                    int rows =0;
                    if(SQLString.IndexOf("insert") != -1)
                        rows = Convert.ToInt32(cmd.ExecuteScalar());
                    else
                        rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (SQLiteException e)
                {
                    connection.Close();
                    throw e;
                }
            }
        }
    }

注意15行到18行,判斷是否是insert操作.然后執行cmd.ExecuteScalar(),而不是cmd.ExecuteNonQuery().這樣就實現在同一個SQLiteConnection啦!

鏈接: SQLite中獲取最新添加自增ID,last_insert_rowid()的使用 - 飯 - 博客園

-------------------------------------------------------------------------

 七. sqlite查詢特定時間段的數據

  1.查詢某一天的數據 

SELECT Utitle,Uurl,Utime FROM Urls WHERE Uisok=1 AND date(Utime)=date('2014-02-10')

  2.查詢今天的數據  (待測試)

select  time>=datetime('now','start of day','+0 day') and time<datetime('now','start of day','+1 day') from

  3.查詢昨天的數據  (待測試)

select  time>=datetime('now','start of day','-1 day') and time<datetime('now','start of day','+0 day') from

  4.查詢本周的數據   (待測試) 

select  time>=datetime('now','start of day','-7 day','weekday 1') AND time<datetime('now','start of day','+0 day','weekday 1') from

    (時間取的是 周一到周日為一周)

  5.查詢本月的數據 

select * FROM UMembers WHERE UTime >=datetime('now', 'start of month', '+0 month', '-0 day') and UTime<datetime('now', 'start of month', '+1 month', '0 day')

  6.查詢上一月的數據 (待測試)

select Time>=datetime('now','start of month','-1 month','-0 day') AND Time <datetime('now','start of month','+0 month','-1 day')  from

-------------------------------------------------------------------------

八.Sqlite分頁數據查詢

sqlite中 limit 一般的語法格式為:

 Select * From Person  Limit 9 Offset 10;

表示從 數據庫Person 中 第10條開始 共獲取9條數據

也可以使用 簡寫形式:

 Select * From Person  Limit 10,9;

 

--查詢相應條數數據 相當於sql中的 top  --0,2 從第幾條開始 共查詢多少條 
SELECT Bid,BTitle,BContent,BLink,BImg,BDate FROM XBooks WHERE BDel=0 ORDER BY BDate DESC LIMIT 0,2

 分頁查詢

 string sql2 = string.Format("SELECT Bid,BTitle,BContent,BLink,BImg,BDate FROM XBooks WHERE BDel=0 ORDER BY BDate DESC LIMIT {0}*{1},{1}", pageIndex - 1, pageSize);
 string sql = string.Format("SELECT Bid,BTitle,BContent,BLink,BImg,BDate FROM XBooks WHERE BDel=0 ORDER BY BDate DESC LIMIT {0} offset {0}*{1}", pageSize, pageIndex - 1);//pageSize:每頁顯示條數,pageIndex頁碼

 

------------------------------------------------------------------------

 

 

-------------------------------------------------------------------------

未完待續。。。

 

轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM