3

以下は、Microsoft OLE DB Provider forSQLServerで構成ツールを使用してデータベースに接続したときに生成される接続文字列です。

Provider=SQLOLEDB.1;Password=password;Persist Security Info=True;User ID=sa;
Initial Catalog=database;Data Source=localhost;Use Procedure for Prepare=1;
Auto Translate=True;Packet Size=4096;Workstation ID=computer1;
Use Encryption for Data=False;Tag with column collation when possible=False

同じデータベースに接続しているが、SQL Server Native Client 10.0を使用している場合、この接続文字列を取得します。

Provider=SQLNCLI10.1;Integrated Security=\"\";Persist Security Info=False;
User ID=sa;Initial Catalog=database;Data Source=localhost;Use Procedure for Prepare=1;
Auto Translate=True;Packet Size=4096;Workstation ID=computer1;
Initial File Name=\"\";Use Encryption for Data=False;
Tag with column collation when possible=False;
MARS Connection=False;DataTypeCompatibility=0;Trust Server Certificate=False\0

これらの接続文字列のいずれかを読み取り、それを使用してデータベースへの接続を作成するac#アプリケーションがあります。

SqlConnectionStringBuilder _sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
OleDbConnectionStringBuilder conBuilder = new OleDbConnectionStringBuilder( CONNECTION STRING SHOWN ABOVE);
_initialCatalogValue = (string)conBuilder["Initial Catalog"];
_dataSourceValue = conBuilder.DataSource;

_sqlConnectionStringBuilder.Password = (string)conBuilder["Password"];
_sqlConnectionStringBuilder.UserID = (string)conBuilder["User Id"];
_sqlConnectionStringBuilder.InitialCatalog = _initialCatalogValue;
_sqlConnectionStringBuilder.DataSource = _dataSourceValue;
_sqlConnectionStringBuilder.PersistSecurityInfo = true;

_conn = new SqlConnection(_sqlConnectionStringBuilder.ConnectionString);
_conn.Open();

SQL Serverネイティブクライアントを使用するとパスワードが空になり、ログイン時にSQLConnectionが失敗するという問題。私が得るエラーは「ユーザー'sa'のログインに失敗しました」です。

OLEDB接続文字列は正常です。C#で使用しているクラスの一部が原因で、SQL Server Native Clientのログインに失敗していませんか?SQL Server Native Client 10.0はパスワードを暗号化しますか?接続文字列に含まれているプロバイダーを特定し、2つの異なるコードパスを使用する必要がありますか?もしそうなら、接続するには何が必要ですか?

基本的な質問は、受信した接続文字列(上記の2つのみ)に関係なく、接続を成功させるにはどうすればよいですか?

注意:接続文字列を制御することはできません。私は自分が受け取っているものでしか作業できません。

4

2 に答える 2

1

指定する2番目の接続文字列には、パスワードは含まれていません。したがって、2番目の文字列conBuilder["Password"]に設定すると、空の文字列が返されconBuilder.ConnectionStringます。

于 2013-01-28T15:27:06.963 に答える
0

この問題は次のように解決されました。

上記の接続文字列を利用して次のことを行うメインアプリケーションがありました。

アプリケーションは接続文字列を受け取ります。接続文字列のプロバイダーがSQLServerNative Client(SQLNCLI10.1)の場合、アプリケーションは永続的なセキュリティをチェックします。何も見つからない場合は、IntegratedSecurity = SSPIを接続文字列に追加し、代わりにWindows認証を使用して接続します。これが正しい(または安全なこと)であるかどうかは、それが行われていたことです。

質問に「答える」。接続文字列を取り込むことができ、パスワードが見つからない場合は、IntegratedSecurity=SSPIを設定できます。これにより、SQLServer認証の代わりにWindows認証を使用して接続できるようになります。私はあなたがそうすることを勧めていませんが、それはうまくいくでしょう。

于 2013-01-29T13:40:02.673 に答える