最近在做SQLite開發(fā),開發(fā)環(huán)境是VS2010+ SQLite Ado.Net data PRovider。這套Data Provider程序是基于System.Data.SQLite 1.0.66版本,下面就總結(jié)一下開發(fā)SQLite過程中的經(jīng)驗(yàn)。
sqlite的管理工具很多,我比較喜歡用Navicat。個(gè)人建議用Navicat。
SQLiteConnection sqlconn = new SQLiteConnection(@"Data Source=C:/cache;Version=3;PassWord=123");sqlconn.Open();SQLiteCommand sqlCom = sqlconn.CreateCommand();sqlCom.CommandText = "VACUUM";sqlCom.ExecuteNonQuery();3.非空類型(Nullable<long>)
SQLite中的列映射到實(shí)體對(duì)象屬性時(shí),默認(rèn)是Nullabe型的。而Nullable型數(shù)據(jù)開發(fā)比較麻煩,為了避免這個(gè)問題,可在數(shù)據(jù)庫中將列設(shè)置為非空。4.外鍵的Delete Cascade不起作用
產(chǎn)生這個(gè)問題主要有兩個(gè)原因,有可能是在edmx中cascade設(shè)置沒被創(chuàng)建,也有可能是程序運(yùn)行時(shí)數(shù)據(jù)庫對(duì)象沒加載到內(nèi)存。
使用SQLite Ado.Net data Provider的Designer工具導(dǎo)入*.db文件時(shí),外鍵的Cascade信息沒能正確導(dǎo)入,這個(gè)可能是Provider的BUG。這時(shí)需要在edmx編輯界面手動(dòng)進(jìn)行修改。在*.edmx窗口選擇連接線,在Property窗口手動(dòng)修改End1 OnDelete屬性為Cascade。就算在edmx中設(shè)置正確,還是會(huì)發(fā)現(xiàn)cascade有時(shí)生效,有時(shí)不生效。這時(shí)因?yàn)槿绻?.db庫中的數(shù)據(jù)如果沒加載進(jìn)內(nèi)存,cascade就不生效。因此,如果希望cascade生效,還要將關(guān)聯(lián)的表手動(dòng)加載(有點(diǎn)像Hibernate的懶加載機(jī)制)。這時(shí)t1表中的一行刪除時(shí),t11表中的相關(guān)數(shù)據(jù)才會(huì)跟著被刪除,代碼如下。但是這樣也造成了SQLite性能的下降,具體還要根據(jù)業(yè)務(wù)需求來進(jìn)行取舍。if(!t1.t11.IsLoaded) t1.t11.Load();5.程序部署報(bào)錯(cuò)
因?yàn)镾QLite Ado.Net data Provider會(huì)將常用dll注冊(cè)到GAC,所以在本機(jī)運(yùn)行時(shí)一般不會(huì)有問題,但是部署到別的機(jī)器就會(huì)報(bào)錯(cuò)。這時(shí)需要做三個(gè)操作:
拷貝引用庫。將System.Data.SQLite.dll、System.Data.SQLite.Linq.dll等幾個(gè)相關(guān)dll拷貝到應(yīng)用程序目錄下。在*.exe.config中,將connection stirng從絕對(duì)路徑改為相對(duì)路徑。在*.exe.config中,添加引用配置信息。<?xml version="1.0" encoding="utf-8"?><configuration> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite"/> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="DTMEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string="data source=DTM.db"" providerName="System.Data.EntityClient" /> </connectionStrings></configuration>
新聞熱點(diǎn)
疑難解答
圖片精選