以前使用MySQL,只是簡單的利用Connection,Command做一些小P測試程序,對MySQL的認(rèn)識也只是停留在它是個數(shù)據(jù)庫而已,跟SQL Server沒有神馬區(qū)別。
現(xiàn)在項目開發(fā)過程中,越來越依賴ORM、依賴注入,今天使用MySQL配置了一把,過程中出現(xiàn)了一點(diǎn)小小問題,主要原因就是:Spring不能初始化MySQL的數(shù)據(jù)庫Provider。
我安裝的MySQL版本是5.0.27
項目添加的MySQL驅(qū)動的版本是Assembly MySql.Data, Version 5.1.7.0
Spring相關(guān)配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database">
<!-- Referenced by main application context configuration file -->
<description>
Definitions for the NHibernate Objects.
</description>
<!-- Database and NHibernate Configuration -->
<db:provider id="DbProvider"
provider="MySql-5.0"
connectionString="Data Source=localhost;User Id=root;Password=root;database=moye"/>
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Meego.Moye.HibernateDAL.Mapping</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect" value="NHibernate.Dialect.MySQL5Dialect"/>
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
<entry key="hibernate.show_sql" value="false"/>
</dictionary>
</property>
</object>
<object id="HibernateTransactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
</objects>
按照項目分層的原則,類關(guān)系如圖:
注入TeacherDao:
<object id="TeacherDao" type="Meego.Moye.HibernateDAL.MySQL.TeacherDaoHibernate,Meego.Moye.HibernateDAL.MySQL">
<property name="HibernateTemplate" ref="HibernateTemplate"/></object>
在Default.aspx頁面中注入TeacherDao:
<object type="~/Default.aspx">
<property name="TeacherDao" ref="TeacherDao"></property>
</object>
頁面中獲取List<Teacher>列表:
IList<Teacher> teachers = this.teacherDao.GetTeachers();
項目部署到現(xiàn)在,基本已經(jīng)搞定,為了簡單,這里沒有配置IBLL層和BLLImpl層。
跟以前配置ORM及依賴注入一樣,可是程序會奇怪的報一個錯誤:
Error thrown by a dependency of object 'MySql-5.0' defined in 'assembly [Spring.Data, Version=1.1.2.20125, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml]' :Unsatisfied dependency expressed through constructor argument with index 2 of type [System.Type] :Could not convert constructor argument value [MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=5.0.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d] to required type [System.Type] :Cannot convert property value of type [System.String] to required type [System.Type] for property ''.
while resolving 'constructor argument with name dbmetadata' to '(inner object)' defined in 'assembly [Spring.Data, Version=1.1.2.20125, Culture=neutral, PublicKeyToken=65e474d141e25e07], resource [Spring.Data.Common.dbproviders.xml]'
主要原因是配置DbProvider時候,Spring不能初始化數(shù)據(jù)庫Provider。
查看Spring支持?jǐn)?shù)據(jù)庫Provider:
名稱 |
介紹 |
|
Microsoft SQL Server, provider V |
|
Microsoft SQL Server, provider V |
|
Microsoft SQL Server Compact Edition, provider V9.0.242.0 |
|
Microsoft SQL Server Compact Edition, provider V |
|
provider V1.0. |
|
provider V |
|
Oracle, Microsoft provider V |
|
Oracle, Oracle provider V2.102.2.20 |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
MySQL provider |
|
Postgresql provider |
|
Postgresql provider 1.98.1.0 beta 1 |
|
Postgresql provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
IBM DB2 Data Provider |
|
SQLite provider |
|
SQLite provider |
|
Sybase ASE provider for ASE 12.x |
|
Sybase ASE provider for ASE 15.x |
|
Sybase ADO.NET 2.0 provider for ASE 12.x and 15.x |
|
ODBC provider V1.0. |
|
ODBC provider V |
InterSystems.Data.CacheClient |
Caché provider Version |
具體請查看Spring.Net 官方文檔 Chapter 19. DbProvider。
我的MySQL版本是5.1.7.0沒有對應(yīng)的版本,具體什么原因,在網(wǎng)站查找資料也沒有發(fā)現(xiàn)解決方法,
沒有辦法我只好從MySQL的官方文檔上下來了最新的MySQL-connector-net安裝到機(jī)器上,重新啟動網(wǎng)站,
測試已經(jīng)沒有問題。
難道是安裝MySQL-connector-net時,重新配置了VS環(huán)境的問題?
本人就是愛折騰,接下來把MySQL-connector-net安裝目錄下的MySql.Data.dll拷貝出來,放到項目文件里,修改網(wǎng)站引用的程序集,
卸載MySQL-connector-net,測試網(wǎng)站,未果,還是報錯。
最后修改DbProvider name屬性:
<!-- Database and NHibernate Configuration -->
<db:provider id="DbProvider"
provider="OracleClient-2.0"
connectionString="Data Source=localhost;User Id=root;Password=root;database=moye"/>
測試正常。
有點(diǎn)無語,不過還是把mysql-connector-net安裝上,算是一種合適的解決方式。
大家有沒有遇到相同的問題,小弟對這其中的原理不是很清楚,希望知道的朋友幫忙解釋一下,感謝。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點(diǎn)擊進(jìn)入論壇