2013-05-08 67 views
0

的C#代码段会用来连接到SQL Server 2008实例(默认情况下,未命名实例):SQL登录SQL Server 2008上没有为远程连接

using (SqlConnection conn = new SqlConnection(sqlConnType)) 
{ 
    conn.Open(); 
    using (SqlCommand query = conn.CreateCommand()) 
    { 
     query.CommandText = ConfigurationManager.AppSettings["query"].ToString(); 
     using (SqlDataReader dataReader = query.ExecuteReader()) 
     { 
      if (dataReader.HasRows && dataReader.Read()) 
      { 
       // do something with the result 
      } 
     } 
    } 
} 

基于命令行参数,sqlConnType (使用的参数来实例化一个SqlConnection对象)是下述之一:

Windows集成认证:Data Source=<ServerName>;database=<DatabaseName>;Integrated Security=True

SQL验证:server=<ServerName>;database=<DatabaseName>;user id=<UserID>;pwd=<Password>

我已添加防火墙规则以允许SQL通信。命名管道和TCP/IP已启用。 Windows和SQL Server身份验证也都启用。现在奇怪的部分...

当使用上述代码的应用程序使用Int远程连接到SQL Server时。 Windows身份验证,连接工作得很好。然而,当我尝试使用SQL Server身份验证进行远程连接,我得到的错误:Cannot open database "<DatabaseName>" requested by the login. The login failed. Login failed for user '<UserID>'.如果我打印出异常的堆栈跟踪,我得到的是这样的:

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) 
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) 
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 
at App.Program.Main(String[] args) in C:\App\Program.cs:line 31 

注意:如果我运行应用程序本地在SQL Server,Int。 Windows身份验证工作,但不是SQL登录身份验证。相同的应用程序可以使用相同的代码在两种认证模式下与较旧版本的SQL Server(例如2005)进行通话,并且相同的连接字符串也可以。

我在做什么错?是否缺少特定于SQL Server 2008的东西?

+0

你能与本地SQL身份验证凭据登录? – 2013-05-08 19:03:24

+0

我以为我可以......现在看起来像是不工作。 – 2013-05-08 19:04:12

+1

找出来,你很可能会有一个解决方案。就域验证而言,您的应用是否在该凭证下运行? – 2013-05-08 19:05:06

回答

0

感谢大家谁看着这个并提供反馈!事实证明,这是一场虚惊,因为我在看错服务器。几个月前,我建立了一个更新的服务器,并将所有数据库迁移到那里。我使用旧的服务器主机名设置SQL别名以路由到新的服务器。我忘了它,并试图解决旧服务器上的问题。整个过程中,这是新配置的服务器仅用于Windows身份验证,我只需将其更改为混合模式身份验证即可。这解决了这个问题。

我也接触过一些有见地的链接,当你遇到连接问题:

Troubleshoot Connectivity/Login Failures SQL Server 2008