zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

在使用sqlite时淌过的坑

SQLite 使用
2023-09-11 14:16:54 时间

以前一直用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();正常了...