0

Fluent NHibernateに基づいた単純なSQLジェネレーターXAMLアプリケーションを作成しました。これにより、データベースで実行するDDLを生成できます。ローカルのMySQLセットアップでは、正常に機能します。

SQLAzureで実行したいと思います。

  • 管理ポータルでNHアプリケーションをホストするWebサイトを作成しました。小切手!
  • NHアプリケーションで使用するデータベースを作成しました。小切手!
  • IPアドレスがSQLAzureに接続できるようにファイアウォールルールを設定しました。小切手!
  • Azureの公式DB管理ポータルに接続して、自分の資格情報でログインしようとしました。小切手!
  • 正しい接続文字列(パスワードを再確認)でNHibernateスキーマジェネレーターを実行しようとしましたが、エラーが発生しました。ブーム!

エラー(匿名化)は次のとおりです

---------------------------

---------------------------
Cannot open database "[MyDb]" requested by the login. The login failed.

Login failed for user 'mydblogin'.

This session has been assigned a tracing ID of '{{guid}}'.  Provide this tracing ID to customer support when you need assistance.
---------------------------
OK   
---------------------------

コード:

PersistenceConfigurer persistenceConfigurer = MsSqlConfiguration.MsSql2008
    .Dialect<MsSqlAzure2008Dialect>()
    .Driver<SqlClientDriver>()
    .FormatSql()
    .ShowSql()
    .ConnectionString(connectionString);

FluentConfiguration fc = Fluently.Configure()
    .Database(persistenceConfigurer)
    .ExposeConfiguration(
        cfg => cfg.SetProperty("hbm2ddl.keywords", "auto-quote")
                    .SetProperty("hbm2ddl.auto", "none"))
    .Mappings(
    m => m.FluentMappings.AddFromAssemblyOf<NHibernateFactory>()
    .Conventions.AddFromAssemblyOf<NHibernateFactory>());
Configuration ret = fc.BuildConfiguration();
SchemaMetadataUpdater.QuoteTableAndColumns(ret);

接続文字列(あいまい)

Server=tcp:dbhost.database.windows.net,1433;Database=[MyDb];User ID=login@dbhost;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;

例外はSystem.Data.SqlClient.SqlException (0x80131904)

スタックトレース

   in System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   in System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   in System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   in System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   in System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   in System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
   in System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
   in System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
   in System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions)
   in System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   in System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   in System.Data.SqlClient.SqlConnection.Open()
   in NHibernate.Connection.DriverConnectionProvider.GetConnection()
   in NHibernate.Tool.hbm2ddl.ManagedProviderConnectionHelper.Prepare()
   in NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect dialect, IConnectionHelper connectionHelper)
   in NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(IDictionary`2 cfgProperties)
   in NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.QuoteTableAndColumns(Configuration configuration)
   in HbmSchemaExporter.NHibernateManager.BuildNHConfig(String connectionString, DbType dbType, Dialect& requiredDialect)
   in HbmSchemaExporter.NHibernateManager.GenerateSql(MainWindowViewModel viewModel)
   in HbmSchemaExporter.MainWindow.btnGenerateSql_Click(Object sender, RoutedEventArgs e)

質問は明らかです:コードまたは構成の何が問題になっていますか?パスワードが正しく入力されていることを確認しました。残りの接続文字列をコピーして、パスワードプレースホルダーを置き換えました。https://yourdbhost.database.windows.net/を使用できないファイアウォールルールとファイアウォールルールなしのAFAIKを設定しました

4

2 に答える 2

2

この正確な質問に対する回答を数時間探していましたが、上記の質問のコメントにより、Azure 管理ポータルによって提供される接続文字列から角かっこを削除することになりました。

接続は角括弧なしで成功しました。私の接続文字列は次のとおりです(太字のセクションを実際の詳細に置き換えてください):

サーバー = tcp: SERVER .database.windows.net,1433;データベース = MYDB ;ユーザー ID = USER@SERVER ;パスワード = PASSWORD ;Trusted_Connection = False;暗号化 = True;接続タイムアウト = 30;

于 2013-03-31T01:39:51.030 に答える
0

信じられないかもしれませんが、この接続文字列は FNH コードにわずかな変更を加えるだけで機能しました (conn 文字列を変更した後にのみ機能し始めました)。

Data Source=xxxxx.database.windows.net;Initial Catalog=MyDb;Persist Security Info=True;User ID=zshop;Password=xxxxxxx

を使用する代わりに、andDatabaseを使用する必要がありました。DB名の括弧なしInitial CatalogPersist Security Info

エラーがログインの失敗を報告したので、犯人はPersist Security Info.

今、私は別の質問で議論すべき別の問題を抱えています

于 2013-03-23T13:23:12.567 に答える