无法从NHibernate.Driver.SQLiteDriver创建驱动程序

时间:2011-03-04 09:15:55

标签: nhibernate sqlite system.data.sqlite

对不起,我再次发布这个问题。我用Google搜索并在stackoverflow和其他文件上找到了很多帖子和帖子,但没有一个对我有用 我运行Windows窗体应用程序时收到此错误消息。 这是我的App.config文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="NHibernate.Test">
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
      <property name="connection.connection_string">
        Data Source=nhibernate.db;Version=3;New=True;
      </property>
      <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
      <property name="query.substitutions">true=1;false=0</property>
      <property name="proxyfactory.factory_class">
        NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu
      </property>
    </session-factory>
  </hibernate-configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

我在Windows Server 2008 R2 64位上使用Visual Studio 2010。 我的项目配置是X86,我尝试了System.Data.SQLite.dll文件的x86,x64和ManagedOnly版本,但似乎都没有。

有人可以帮我这个吗? P.S:我知道这个线程有类似的线程,但请不要关闭这个线程,因为没有一个解决方案对我有效。

感谢。

3 个答案:

答案 0 :(得分:2)

这是错误:

NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.SQLiteDriver. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> NHibernate.HibernateException: The IDbCommand and IDbConnection implementation in the assembly SQLite.NET could not be found. Ensure that the assembly SQLite.NET is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly.
   at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, String connectionTypeName, String commandTypeName)
   at NHibernate.Driver.SQLiteDriver..ctor()
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type)
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   --- End of inner exception stack trace ---
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings)
   at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2 properties)
   at NHibernate.Cfg.Configuration.BuildSettings()
   at NHibernate.Cfg.Configuration.BuildSessionFactory()
   at Employee.App.SessionProvider.get_Session() in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\SessionProvider.cs:line 28
   at Employee.App.EmployeeManager.get_Session() in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\EmployeeManager.cs:line 14
   at Employee.App.EmployeeManager.Save(Employee employee) in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\EmployeeManager.cs:line 56
   at Employee.App.frmMain.frmMain_Load(Object sender, EventArgs e) in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\frmMain.cs:line 23
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

答案 1 :(得分:0)

错误似乎与驱动程序创建有关,这表明我的系统上没有正确安装驱动程序。我刚刚测试了它,它适用于我(好吧我使用的是monodevelop,而不是VS),我从这里安装了Sqlite驱动程序:

ADO.NET 2.0 Provider for SQLite

然后我在app.config文件中使用了它:

<session-factory>            
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
        <property name="connection.connection_string">Data Source=SimpleExample.sqlite;Version=3</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>         
        <mapping assembly="SimpleExample" />
    </session-factory>

答案 2 :(得分:0)

似乎没有加载SQLite程序集,因此出现错误:

无法从NHibernate.Driver.SQLiteDriver创建驱动程序。 ---&GT; System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; NHibernate.HibernateException:找不到程序集SQLite.NET中的IDbCommand和IDbConnection实现。确保程序集SQLite.NET位于应用程序目录或全局程序集缓存中。如果程序集位于GAC中,请使用应用程序配置文件中的元素指定程序集的全名。

您可以使用以下方式预加载程序集:

PreLoadAssembliesFromPath(AppDomain.CurrentDomain.BaseDirectory);

private static void PreLoadAssembliesFromPath(string p)
{
    //S.O. NOTE: ELIDED - ALL EXCEPTION HANDLING FOR BREVITY

    //get all .dll files from the specified path and load the lot
    FileInfo[] files = null;
    //you might not want recursion - handy for localised assemblies 
    //though especially.
    files = new DirectoryInfo(p).GetFiles("*.dll",SearchOption.AllDirectories);

    AssemblyName a = null;
    string s = null;
    foreach (var fi in files)
    {
        s = fi.FullName;
        //now get the name of the assembly you've found, without loading it
        //though (assuming .Net 2+ of course).
        a = AssemblyName.GetAssemblyName(s);
        //sanity check - make sure we don't already have an assembly loaded
        //that, if this assembly name was passed to the loaded, would actually
        //be resolved as that assembly.  Might be unnecessary - but makes me
        //happy :)
        if (!AppDomain.CurrentDomain.GetAssemblies().Any(assembly =>
          AssemblyName.ReferenceMatchesDefinition(a, assembly.GetName())))
        {
            //crucial - USE THE ASSEMBLY NAME.
            //in a web app, this assembly will automatically be bound from the 
            //Asp.Net Temporary folder from where the site actually runs.
            Assembly.Load(a);
        }
    }
}