この 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 に固有のものですか?