在使用sqlite时淌过的坑
以前一直用sqlite.net 1.0.66.0版本,在.net4下面程序写好了部署到目的地机器时winform程序总是出现缺少运行时的问题。有时装了运行时也还是出问题,后来发现是混合模式的问题,当时是增加以下配置解决的:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/> </startup>
事隔一年后,使用sqlite.net 1.0.89.0又遇到这个问题,这次加了这个也没效果,而且不报错提示缺少dll等错误,单单抓到报“System.Threading.ThreadExceptionEventArgs”尼玛我人品差啊,这是何错误,这个异常的范围很广的有木有! 下载运行时安装了跑demo正常,但是程序还是报错。
问题锁定:
肯定还是配置问题。经过一番艰苦排查,终于发现是使用了EF for sqliite,必须在配置文件理加入以下节点:
<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, Version=1.0.89.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> </DbProviderFactories> </system.data>
总结:
人品有问题啊,老是解决了问题不求甚解不去找原理,这不科学啊!
原因是EF使用SQLite Data Provider在构造DbProviderFactories时需要从配置里读取sqlite的版本等信息,然后才能正常实例化ObjectContext对象。
另外,还遇到妖怪的事:
using (ScanLocalDbEntities db = new ScanLocalDbEntities(dbConnStr)) { db.DBExecute("delete from ImportPrdSKU_Info"); db.DBExecBatchSQL(sqls); System.Threading.Thread.Sleep(300); db.Refresh(System.Data.Objects.RefreshMode.StoreWins,db.SKU_Info); db.Connection.Close(); }
using之后用文件流操作那数据库文件,老说有另一个线程占用。难道是没Close Connect?关闭了也不行。超出我常识了,晕了。基础不好啊,到底会写程序不大哥?!
加了个 GC.Collect();正常了...
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"作者:" 数据酷软件工作室
"出处:" http://datacool.cnblogs.com
"专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"作者:" 数据酷软件工作室
"出处:" http://datacool.cnblogs.com
"专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++