sqlite数据库在使用时遇到的奇葩问题记录.docx
- 文档编号:8784173
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:11
- 大小:393.87KB
sqlite数据库在使用时遇到的奇葩问题记录.docx
《sqlite数据库在使用时遇到的奇葩问题记录.docx》由会员分享,可在线阅读,更多相关《sqlite数据库在使用时遇到的奇葩问题记录.docx(11页珍藏版)》请在冰豆网上搜索。
sqlite数据库在使用时遇到的奇葩问题记录
sqlite数据库在使用时遇到的奇葩问题记录
有时候做些简单的项目一般都会选择sqlite数据库,优点有很多,这里就不详细说了。
在此主要记录一些平时在使用时遇到的问题及解决方法。
希望能对大家有所帮助。
-------------------------------------------------------------------------
一:
sqlite一直提示thedatabasefileislocked
解决:
-----------------------------------------------------------------------------
二:
错误提示-混合模式程序集是针对v2.0........
解决:
------------------------------------------------------------------
三:
在IIS中发布网站程序时,如果操作系统是64位的,有时候会出现访问错误的问题,这时可以将应用程序高级设置中的“启用32位应用程序”设置项改为True,再测试是否成功。
(如果“启用32位应用程序项为True”时网站提示下面的错误黄页,则可以将该项设置为False试试看。
2014-5-24更新:
今天在测试一个网站时,发现在True的情况下网站报错,则将该项切换为了False,则可以访问了。
至于如何来解释这种问题,待研究。
)
这种情况的一种错误现象是:
在IIS中发布使用sqlite数据库的网站项目时,配置好IIS后访问,页面可能就是显示下面的:
这时就需要你去修改应用程序池的模式了:
---------------------------------------------------------------------------
四:
使用sql语句插入当前时间
在sqlserver中,如果在操作数据时需要插入当前时间的情况,可以使用GETDATE() 来插入,而在sqlite中则不同:
INSERTINTOMWaitPlayList(Msongid,Mtitle,Mauthor,Mtime)VALUES(@songid,@title,@author,datetime('now','localtime'))
要用 datetime('now','localtime') 来插入。
项目实例:
#region将歌曲添加到待播放列表中
///
///将歌曲添加到待播放列表中
///
///
///
///
///
publicstaticboolXMusicAddtoWaitList(longsongid,stringsongtitle,stringsongauthor)
{
stringsql="INSERTINTOMWaitPlayList(Msongid,Mtitle,Mauthor,Mtime)VALUES(@songid,@title,@author,datetime('now','localtime'))";
SQLiteParameter[]parameter={
newSQLiteParameter("@songid",DbType.Int64),
newSQLiteParameter("@title",DbType.String,200),
newSQLiteParameter("@author",DbType.String,200)
};
parameter[0].Value=songid;
parameter[1].Value=songtitle;
parameter[2].Value=songauthor;
introw=ZXSQLiteHelper.ExecuteSql(sql,parameter);
if(row>0)
{
returntrue;
}
else
{
returnfalse;
}
}
-------------------------------------------------------------------------
五.数据库配置
Web.Config或App.Config文件中的设置:
数据库文件要放在App_Data文件夹中:
-------------------------------------------------------------------------
六. SQLite中获取最新添加自增ID,last_insert_rowid()的使用
今天在用sqlite数据库时,想要在新插入数据的同时获取自增的id值,从网上找了找,发现可以用last_insert_rowid()这个函数来获取,但是在sql语句中执行时却一直返回0。
于是又在网上找到了一个相关的文章,经测试可行。
遂记录一下。
出现上面所提问题的主要原因是“last_insert_rowid()”函数必须要和insert语句一起使用,说的再明白点,就是必须是由同一个“SQLiteConnection”来操作。
修改后的sqliteHelper:
///
///执行插入语句,并获取最新的一条数据的id
///
///
///
///
publicstaticlongExecuteGetInsertId(stringSQLString,paramsSQLiteParameter[]cmdParms)
{
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
using(SQLiteCommandcmd=newSQLiteCommand())
{
longresult=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.SQLiteExceptionE)
{
result=-1;
thrownewException(E.Message);
}
returnresult;
}
}
}
sql语句:
stringsql="INSERTINTOUMembers(QId,UName,UPwd,UEmail,UPhoto,UTime)VALUES(5,@uname,@upwd,@uemail,@uphoto,datetime('now','localtime'));SELECTlast_insert_rowid()fromUMembers";
-----------------------------------
参考:
今天在我的数据类中给Add方法完善一下.想要实现添加之后返回添加的实体的自增ID,遂想起了selectlast_insert_rowid(),可是用了之后就是不好使,各种返回0,
后来经度娘指教,我发现一句话"在同一个SQLiteConnection中...",原来如此.修改代码,搞定!
我之前是这么写的
DBHelperSQLite.ExecuteSql(sql,parameters);
returnConvert.ToInt32(DBHelperSQLite.GetSingle("selectlast_insert_rowid()"));
注意:
由于我的DBHelper写法的原因,这样的话就变成了两个SQLiteConnection
改进后
returnDBHelperSQLite.ExecuteSql(sql+";selectlast_insert_rowid();",parameters);
DBHelper修改
publicstaticintExecuteSql(stringSQLString,List
{
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
using(SQLiteCommandcmd=newSQLiteCommand(SQLString,connection))
{
try
{
connection.Open();
foreach(SQLiteParameterpinpara)
{
cmd.Parameters.Add(p);
}
introws=0;
if(SQLString.IndexOf("insert")!
=-1)
rows=Convert.ToInt32(cmd.ExecuteScalar());
else
rows=cmd.ExecuteNonQuery();
returnrows;
}
catch(SQLiteExceptione)
{
connection.Close();
throwe;
}
}
}
}
注意15行到18行,判断是否是insert操作.然后执行cmd.ExecuteScalar(),而不是cmd.ExecuteNonQuery().这样就实现在同一个SQLiteConnection啦!
链接:
SQLite中获取最新添加自增ID,last_insert_rowid()的使用-饭-博客园
-------------------------------------------------------------------------
七.sqlite查询特定时间段的数据
1.查询某一天的数据
SELECTUtitle,Uurl,UtimeFROMUrlsWHEREUisok=1ANDdate(Utime)=date('2014-02-10')
2.查询今天的数据 (待测试)
selecttime>=datetime('now','startofday','+0day')andtime 3.查询昨天的数据 (待测试) selecttime>=datetime('now','startofday','-1day')andtime 4.查询本周的数据 (待测试) selecttime>=datetime('now','startofday','-7day','weekday1')ANDtime (时间取的是周一到周日为一周) 5.查询本月的数据 select*FROMUMembersWHEREUTime>=datetime('now','startofmonth','+0month','-0day')andUTime 6.查询上一月的数据(待测试) selectTime>=datetime('now','startofmonth','-1month','-0day')ANDTime ------------------------------------------------------------------------- 八.Sqlite分页数据查询 sqlite中limit一般的语法格式为: Select*FromPerson Limit9Offset10; 表示从数据库Person中第10条开始共获取9条数据 也可以使用简写形式: Select*FromPerson Limit10,9; --查询相应条数数据相当于sql中的top --0,2从第几条开始共查询多少条 SELECTBid,BTitle,BContent,BLink,BImg,BDateFROMXBooksWHEREBDel=0ORDERBYBDateDESCLIMIT0,2 分页查询 stringsql2=string.Format("SELECTBid,BTitle,BContent,BLink,BImg,BDateFROMXBooksWHEREBDel=0ORDERBYBDateDESCLIMIT{0}*{1},{1}",pageIndex-1,pageSize); stringsql=string.Format("SELECTBid,BTitle,BContent,BLink,BImg,BDateFROMXBooksWHEREBDel=0ORDERBYBDateDESCLIMIT{0}offset{0}*{1}",pageSize,pageIndex-1);//pageSize: 每页显示条数,pageIndex页码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sqlite 数据库 使用 遇到 奇葩 问题 记录