0

現在、ASP.NET MVC 4 Web サイトを postgreSQL から MS SQL に移行しようとしています (その後、SQL Azure を使用します)。Web サイトは 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」付近の構文が正しくありません。---> System.Data.SqlClient.SqlException: キーワード 'Public' 付近の構文が正しくありません。System.Data.SqlClient.SqlConnection.OnError (SqlException 例外、ブール値 breakConnection、アクション1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) で System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj、ブール値 callerHasConnectionLock、ブール値 asyncClose) で System.Data.SqlClient.TdsParser で。 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) の System.Data.SqlClient.SqlCommand での TryRun (RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、Boolean& dataReady)。1 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(Action1 scriptAction, Boolean export, Boolean throwOnError, TextWriter exportOutput, IDbCommand statement, String sql) at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action 1 scriptAction, Boolean export, Boolean justDrop, IDbConnection connection, TextWriter exportOutput) at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action1 scriptAction, Boolean export, Boolean justDrop) --- 内部例外スタック トレースの終了 --- - NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action 1 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, IDictionary2 パラメーター) で System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 継続) で System.Web.Mvc.ControllerActionInvoker.<> c_DisplayClass15 .<>c _DisplayClass17.b__14() で System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary2 つのパラメーター) System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName); で

4

2 に答える 2

2

実際、MS SQL ServerがPUBLICをキーワード(http://msdn.microsoft.com/en-us/library/ms189822%28v=sql.100%29.aspx)として定義しているためだと思います。

このような名前のテーブルまたはプロパティ/列がある可能性があります。マッピングで名前を変更するか、バッククォート( `)で囲んで、NHibernateに方言固有の引用文字を適用させる必要があります。

NHibernate構成で自動見積もりを有効にすることもできます。

于 2013-01-22T08:18:21.323 に答える
0

マッピングにいくつかの補助データベースオブジェクトがあるようです。SQL構文を変更するか、dialect-scopeを使用して複数の方言に提供する必要がある場合があります。

カスタムSQLも名前付きクエリから取得される場合があり、ISessionでCreateSqlQuery()を使用する場合、スキーマの作成中に例外が発生するため、これは発生する可能性が低いようです。他のいくつかのマッピング構造(式やフィルターなど)も、マッピングでカスタムSQLを使用する場合があることに注意してください。

これで問題が解決しない場合は、実際に試行されたSQLコマンドが何であるかを理解する必要があると思います。例外から利用できない場合は、NHibernate.pdbファイルと対応するソースコードを提供することで非常に簡単に実行できるはずです。そして、例外が発生した場所を中断するようにVisualStudioに要求します。

于 2013-01-21T09:34:52.303 に答える