2013-03-22 76 views
0

我已经做了一个基于Fluent NHibernate的简单的SQL生成器XAML应用程序,它允许我生成DDL以运行到数据库。通过本地MySQL设置,它可以正常工作。无法从本地机器连接到SQL Azure

我现在想将它运行到SQL Azure上。

  • 我已创建一个网站,将在管理门户上承载NH应用程序。检查!
  • 我已经创建了NH应用程序使用的数据库。检查!
  • 我已经设置了防火墙规则,允许我的IP地址连接到SQL Azure。检查!
  • 我试图连接到Azure的官方数据库管理门户并使用我的凭据登录。检查!
  • 我试图用正确的连接字符串(双重检查密码)运行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 [email protected];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) 

的问题是显而易见的:什么是错的代码或配置?我确信密码输入正确,我已经复制了连接字符串的其余部分并替换了密码占位符。我已经设置了防火墙规则和AFAIK没有防火墙规则,你不能使用https://yourdbhost.database.windows.net/

+1

(可能是一个愚蠢的评论)SQL Azure需要SSL。你是否检查过你的连接字符串包含Encrypt = True; ? – jbl 2013-03-22 10:45:07

+0

+1,因为它不是一个愚蠢的评论:),无论如何,我的连接字符串中的加密= True! – 2013-03-22 11:03:10

+0

如果您编辑原始问题以包含连接字符串(当然不包含真正的数据库凭证),可能会有所帮助。 – 2013-03-22 11:54:48

回答

2

我一直在寻找的答案,就这个问题询问了几个小时及以上问题的评论使我删除从方括号讨论连接字符串由Azure管理门户提供。

连接成功时没有方括号。我的连接字符串是现在的(用实际的细节替换粗体部分):

Server = tcp:SERVER .database.windows。net,1433; Database = MYDB; User ID = USER @ SERVER; Password = PASSWORD; Trusted_Connection = False; Encrypt = True; Connection Timeout = 30;

+0

我想我会接受这个。尽管更改了连接字符串格式,但我也删除了括号 – 2013-03-31 17:07:51

0

不管你信不信,这个连接字符串一起很小的改动就FNH代码(仅改变康恩串后开始工作)工作

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

而不是使用Database的我不得不使用Initial CatalogPersist Security Info。没有DB名称的括号

由于错误报告登录失败,我相信罪魁祸首是Persist Security Info

现在我还有一个问题,在另一个问题