我目前正在尝试将ASP.NET MVC 4网站从postgreSQL迁移到MS SQL(然后再使用SQL Azure)。该网站与pgsql完美配合。我希望只更改连接字符串和数据库驱动程序就足够了,但我收到一条错误消息说:
NHibernate.HibernateException: Incorrect syntax near the keyword 'Public'. ---> System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'Public'.
请注意,我们使用NHibernate Castle进行数据库交互。这是显示NHibernate配置的web.config部分:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.connection_string">Data Source=.\SQLEXPRESS;Initial Catalog=folke;Integrated Security=SSPI;</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<mapping assembly="Folke" />
</session-factory>
调用此方法时会触发错误:
public static void Install()
{
new SchemaExport(CurrentConfiguration).Execute(true, true, false);
}
这是完整的错误消息:
NHibernate.HibernateException:关键字“Public”附近的语法不正确。 ---&GT; System.Data.SqlClient.SqlException:关键字“Public”附近的语法不正确。在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)处于System.Data.SystemClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose) System.Data的System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout)的.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&amp; dataReady) .SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at NHibernate.Tool.hbm2ddl.SchemaExport.ExecuteSql(IDbCommand cmd, String sql) at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action
1 scriptAction,Boolean export,Boolean throwOnError,TextWriter exportOutput,IDbCommand statement,String sql)at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action1 scriptAction, Boolean export, Boolean justDrop, IDbConnection connection, TextWriter exportOutput) at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action
1 scriptAction ,Boolean export,Boolean justDrop)---内部异常堆栈跟踪结束---在NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action1 scriptAction, Boolean export, Boolean justDrop) at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Boolean script, Boolean export, Boolean justDrop) at FolkeLib.BaseDataAccess.Install() in e:\Documents\GitHub\Folke\FolkeLib\BaseDataAccess.cs:line 36 at Folke.Models.Installer.Install() in e:\Documents\GitHub\Folke\Folke\Models\Installer.cs:line 22 at Folke.Controllers.InstallerController.Index() in e:\Documents\GitHub\Folke\Folke\Controllers\InstallerController.cs:line 20 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
系统.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func
1 continuation)在System.Web.Mvc.ControllerActionInvoker中的2个参数。&lt;&gt; c_ DisplayClass15。&lt; System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String)中的System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList1 filters, ActionDescriptor actionDescriptor, IDictionary
2个参数)中的&gt; c _DisplayClass17.b__14() actionName);
答案 0 :(得分:2)
实际上,我认为这是因为MS SQL Server将PUBLIC定义为关键字(http://msdn.microsoft.com/en-us/library/ms189822%28v=sql.100%29.aspx).
您可能有一些像这样命名的表或属性/列。你应该在映射中重命名它,或者将它包含在反引号(`)中,以使NHibernate应用方言特定的引号字符。
您还可以在NHibernate配置中启用自动引用。
答案 1 :(得分:0)
看起来你的映射中可能有一些Auxiliary Database Objects。您可能必须更改其SQL语法,或使用方言范围为多种方言提供它们。
自定义SQL也可能来自命名查询,如果在ISession上使用CreateSqlQuery(),但由于在模式创建期间发生异常,这似乎不太可能。请注意,其他一些映射构造(如公式和过滤器)也可能在映射中使用自定义SQL。
如果这没有帮助,我认为你必须设法弄清楚实际尝试的SQL命令是什么。如果它不能从异常中获得,那么通过提供NHibernate.pdb文件和相应的源代码应该很容易。并要求Visual Studio打破异常发生的位置。