有時候做些簡單的項目一般都會選擇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頁碼
------------------------------------------------------------------------
-------------------------------------------------------------------------
未完待續。。。
轉載請注明出處。