国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

C#調(diào)用SQlite常見問題匯總

2024-07-21 02:52:18
字體:
供稿:網(wǎng)友

最近在做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)。

1.管理工具(Navicat)

sqlite的管理工具很多,我比較喜歡用Navicat。個(gè)人建議用Navicat。

2.數(shù)據(jù)庫清理(VACUUM)

當(dāng)數(shù)據(jù)庫中的一個(gè)或多個(gè)數(shù)據(jù)表存在大量的插入、更新和刪除等操作時(shí),將會(huì)有大量的磁盤空間被已刪除的數(shù)據(jù)所占用。在沒有執(zhí)行VACUUM命令之前,SQLite并沒有將它們歸還于操作系統(tǒng)。由于該類數(shù)據(jù)表中的數(shù)據(jù)存儲(chǔ)非常分散,因此在查詢時(shí),無法得到更好的批量IO讀取效果,從而影響了查詢效率。可以使用VACUUM的方法對(duì)sqlite數(shù)據(jù)庫進(jìn)行清理。 VACUUM命令在完成數(shù)據(jù)清理時(shí)采用了和PostgreSQL相同的策略,即創(chuàng)建一個(gè)和當(dāng)前數(shù)據(jù)庫文件相同大小的新數(shù)據(jù)庫文件,之后再將該數(shù)據(jù)庫文件中的數(shù)據(jù)有組織的導(dǎo)入到新文件中,其中已經(jīng)刪除的數(shù)據(jù)塊將不會(huì)被導(dǎo)入,在完成導(dǎo)入后,收縮新數(shù)據(jù)庫文件的尺寸到適當(dāng)?shù)拇笮 T赟QLite中,僅支持清理當(dāng)前連接中的主數(shù)據(jù)庫,而不能清理其它Attached數(shù)據(jù)庫。
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中,添加引用配置信息。復(fù)制代碼
<?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=&quot;data source=DTM.db&quot;" providerName="System.Data.EntityClient" />  </connectionStrings></configuration>
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 云林县| 通河县| 棋牌| 红安县| 兴海县| 大渡口区| 纳雍县| 体育| 三江| 临清市| 清水县| 靖宇县| 雷山县| 彭水| 巫山县| 双峰县| 全南县| 宣城市| 赣州市| 达拉特旗| 荥经县| 桓台县| 湘阴县| 曲沃县| 富顺县| 昌都县| 讷河市| 青冈县| 远安县| 临武县| 通河县| 抚松县| 宁蒗| 涞水县| 沙湾县| 安义县| 贵港市| 西城区| 嘉禾县| 伊通| 柏乡县|