11

引っ掛かりに遭遇しました。SQL Server2008R2のローカルインストール用のポート番号を指定する必要があります。これまでのところ、データソースをに設定してSqlConnectionStringBuilderを使用してみました.\TESTSERVER, 1433。これにより、すべてのドキュメントで、ポート1433(デフォルト)でサーバーTESTSERVERに接続できるはずです。

接続文字列は次のようになります。

{Data Source=".\TESTSERVER, 1433";Initial Catalog=AdventureWorks;User ID=testuser;Password=MYPASSWORDHERE}

ただし、次のようなエラーが発生します。

接続SQLサーバーの確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、およびSQLサーバーがリモート接続を許可するように構成されていることを確認してください。(プロバイダー:TCPプロバイダー、エラー:0-ターゲットマシンがアクティブに拒否したため、接続できませんでした。

それを使用して接続文字列を検証すると、MSDNが提案SqlConnectionStringBuilder.ToString()する方法とほぼ同じになります。何らかの理由で、データソースのみを二重引用符で囲み、それ以外は何もラップしません。ただし、これは、データ型に格納されているため、外部引用符を削除するデバッガーである可能性があります。また、ポートを指定せずにSQLサーバーにアクセスできることも確認しました。最後に、サーバーがリモート接続を受け入れることが許可されていることを確認しました。SQL Serverのこのインスタンスがデフォルトのポートを使用してローカルにインストールされていることを考えると、開発用コンピューターでは、なぜこのようなエラーが発生するのか想像できませんでした。string

これは、SqlConnectionStringBuilderが自分のポートを独自のポートでオーバーライドしているためですか?何らかの理由でファイアウォールのポートを開く必要がありますか?完全にローカルインストールであることがわかっているので、ファイアウォールの問題が発生することはありません。接続文字列を手動で作成する必要はありません。難しいことではありませんが、必要な場合を除いて、コードに複雑さの層を追加するだけです。

どんな助けでもいただければ幸いです。ありがとう!

編集:

SqlConnectionStringBuilder構文を長く掘り下げた後、引用符で囲まれた接続文字列に渡すことにより、無効なパラメーターを処理しているように見えます。これは接続文字列が壊れているためだと思います。私の質問はまだ残っています:SqlConnectionStringBuilderを介してポートを渡す方法はありますか、それとも自分で構築する必要がありますか?

4

4 に答える 4

10

TL;DR

データ ソース文字列内のポート番号の前のスペースを削除します。

{Data Source=".\TESTSERVER, 1433";Initial Catalog=AdventureWorks;User ID=testuser;Password=MYPASSWORDHERE}

このように見えるようにします

{Data Source=".\TESTSERVER,1433";Initial Catalog=AdventureWorks;User ID=testuser;Password=MYPASSWORDHERE}

長い答え

少し遊んだ後、カンマとポート番号の間の空白を削除することで、余分な引用符を省略できます。

var stringBuilder = new SqlConnectionStringBuilder();
var sqlCommand = "select TOP 100 * from MyTable;";

stringBuilder.IntegratedSecurity = true;
stringBuilder.InitialCatalog = "MyCatalog";
stringBuilder.DataSource = @"myServer\InstanceName,1433";

// This will give the connection string:
// "Data Source=myServer\\InstanceName,1433;Initial Catalog=MyCatalog;Integrated Security=True"
using (var connection = new SqlConnection(stringBuilder.ToString()))
using (var command = new SqlCommand(sqlCommand, connection))
using (var adapter = new SqlDataAdapter(command))
{
    var table = new DataTable();
    connection.Open();
    adapter.Fill(table);
}

残念ながら、これはあなたが提供したものと同じエラーメッセージにつながります. そのため、ネットワーク通信を詳しく調べたところ、ポート番号を渡さないと、最初にポート 1433 への tcp 接続が試行されますが (通常どおり)、接続されないままになることがわかりました。次に、ポート 1434 への udp 接続を試行し、データが流れる 2 番目の tcp 接続に使用される動的ポート番号を受信します。

Sysinternals の Process Monitor を使用すると、このプロセスを監視できます。

// The first try by using TCP port 1433
WindowsFormsApplication.vshost.exe  5480    TCP Reconnect   MyMachine:53202 -> SqlServerInstance:1433   SUCCESS
WindowsFormsApplication.vshost.exe  5480    TCP Reconnect   MyMachine:53202 -> SqlServerInstance:1433   SUCCESS
// The second try by using UDP port 1434
WindowsFormsApplication.vshost.exe  7664    UDP Send    MyMachine:50245 -> SqlServerInstance:1434   SUCCESS
WindowsFormsApplication.vshost.exe  7664    UDP Receive MyMachine:50245 -> SqlServerInstance:1434   SUCCESS
// Taking informations out of UDP connection to connect to dynamic assigned port
WindowsFormsApplication.vshost.exe  7664    TCP Connect MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Send    MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Send    MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Send    MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Send    MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Send    MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
WindowsFormsApplication.vshost.exe  7664    TCP Receive MyMachine:53209 -> SqlServerInstance:58904  SUCCESS
// Closing of dynamic assigned port
WindowsFormsApplication.vshost.exe  7664    TCP Disconnect  MyMachine:53209 -> SqlServerInstance:58904  SUCCESS

明示的なポート番号を使用すると、最初に指定された行のみが表示され、その後例外がスローされます。したがって、デフォルトのポート番号を定義すると、ポート番号を定義しない場合とは別の動作になります!

それにもかかわらず、サーバーの明示的なポート番号を定義する必要がある場合は、コンマの後のスペースを避けるだけで、接続文字列がきれいに見えます.

于 2012-11-05T09:24:12.463 に答える
0

http://www.connectionstrings.com/sql-server-2008を見てください。

SQL Server 2008 接続文字列には、サーバー インスタンス名を囲む余分な引用符が含まれていません。接続文字列は

Data Source=.\TESTSERVER, 1433;Initial Catalog=AdventureWorks;User ID=testuser;Password=MYPASSWORDHERE
于 2012-07-02T08:27:31.973 に答える
0

私にとっては、次のような仕事です:

//read instance
builder.DataSource.Split(new Char[] { ',' })[0]
//read port number
builder.DataSource.Split(new Char[] { ',' })[1]

//write
builder.DataSource = builder.DataSource.Split(new Char[] { ',' })[0] + ",1234";
于 2014-07-24T14:34:40.497 に答える
0

MSDN SqlConnection.ConnectionString プロパティ

接続先の SQL Server のインスタンスの名前またはネットワーク アドレス。サーバー名の後にポート番号を指定できます。

例: MyDataSource,1433

于 2012-11-05T08:27:04.473 に答える