2011-03-04 97 views
0

对不起,我再次发布此问题。我搜索了它,发现了很多帖子和线程在stackoverflow和其他人,但没有人为我而战。
我运行我的Windows窗体应用程序时出现此错误消息。 这是我App.config文件:无法从NHibernate.Driver.SQLiteDriver创建驱动程序

<?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> 

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

任何人都可以帮助我吗?
P.S:我知道这里有类似的线索,但请不要关闭此线程,因为没有任何解决方案适用于我。

谢谢。

+0

你得到什么错误?你能发布Exception和Stacktrace吗? – 2011-03-04 09:28:54

回答

1

以下是错误:

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) 
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> 
0

似乎SQLite的组件没有加载因此错误:

无法创建从NHibernate.Driver.SQLiteDriver驱动程序。 ---> System.Reflection.TargetInvocationException:调用的目标引发了异常。 ---> 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); 
     } 
    } 
} 
相关问题