0

この C# コードのスニペットは、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. 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 に固有のものですか?

4

1 に答える 1

0

これを見てフィードバックを提供してくれたすべての人に感謝します!間違ったサーバーを見ていたため、誤報であることが判明しました。数か月前、私は新しいサーバーをセットアップし、すべてのデータベースをそこに移行しました。そして、古いサーバーのホスト名を使用して SQL エイリアスを設定し、新しいサーバーにルーティングします。私はそれを忘れて、古いサーバーの問題を解決しようと頑張っていました. ずっと、Windows Auth 用にのみ構成されたのは新しいサーバーであり、Mixed Mode Auth に変更する必要がありました。これで問題は解決しました。

接続の問題が発生したときに、いくつかの洞察に満ちたリンクに出くわしました。

接続/ログイン エラーのトラブルシューティング SQL Server 2008

于 2013-05-10T16:41:14.953 に答える