1

これは奇妙です。VirtualBox 4.2.6 を実行している Mac OS X 10.7.5 64 ビット ホストを使用しています。Microsoft SQL Server Express 2012 を実行するブリッジ ネットワークを備えた Windows 7 SP1 ゲスト (64 ビット) を使用しています。動的ポートではなくポート 1433 で TCP/IP を使用するように SQL Server を構成しました (設定は 0 ではなく空白です)。Windows 7 ゲストの IPv4 アドレスは 192.168.99.132 で、Windows ファイアウォールはオフになっています。

Windows と Mac の両方に、Microsoft SQL Server 2012 JDBC ドライバーと Squirrel SQL クライアント 3.4.0 をダウンロードしました。Windows 7 ゲスト OS 自体で Squirrel を実行すると、"winny"、"localhost"、または "192.168.99.132" のようなゲスト マシン名を使用して、Microsoft JDBC ドライバー経由で SQL Server に問題なく接続できます (JDBC URL jdbc:sqlserver://winny\SQLEXPRESS:1433;databaseName=vha)。ただし、Mac ホストで実行されている Squirrel から SQL Server に接続しようとすると、例外が発生します (以下のスタック トレースを参照)。

ここが奇妙な部分です。Mac ホストからjTDS SQL Server ドライバー (バージョン 1.2.7 は JDK6 を使用しているため、jTDS 1.3.0 は使用できません。そのバージョンは JDK7 のみです) を使用すると、すぐにJDBC URL jdbc:jtds:sqlserver://192.168.99.132:1433/vha。

Microsoft ドライバーは失敗するが、jTDS はリモート ホストから成功する理由はありますか? Microsoft にある jTDS URL から欠落している唯一の情報は、インスタンス名 ("SQLEXPRESS") です。はい、インスタンス名の有無にかかわらず Microsoft URL を試しました。

Mac ホストの Java バージョンは次のとおりです。

java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

Windows 7 ゲストの Java バージョンは次のとおりです。

java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01, mixed mode)

Mac ホストから Windows 7 ゲストに接続するときのスタック トレース:

java.util.concurrent.ExecutionException: java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:232)
    at java.util.concurrent.FutureTask.get(FutureTask.java:91)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.awaitConnection(OpenConnectionCommand.java:132)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.access$100(OpenConnectionCommand.java:45)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand$2.run(OpenConnectionCommand.java:115)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.executeConnect(OpenConnectionCommand.java:171)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.access$000(OpenConnectionCommand.java:45)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand$1.run(OpenConnectionCommand.java:104)
    ... 6 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    at com.microsoft.sqlserver.jdbc.SQLServerException.ConvertConnectExceptionToSQLServerException(SQLServerException.java:241)
    at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2243)
    at com.microsoft.sqlserver.jdbc.TDSChannel.open(IOBuffer.java:491)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1309)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at net.sourceforge.squirrel_sql.fw.sql.SQLDriverManager.getConnection(SQLDriverManager.java:133)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.executeConnect(OpenConnectionCommand.java:167)
    ... 8 more
4

2 に答える 2

0

理論的には、jTDS 接続文字列にインスタンス名も必要です (たとえば、";instance=SQLEXPRESS" を追加します)。しかし、私は jTDS に慣れていないため、間違っている可能性があります。ただし、それを設定せずに接続している場合は、おそらくあなたは何か他のものに接続していますか?

上記の jTDS 接続文字列は IP アドレスで示され、Microsoft の接続文字列は "winny" というサーバー名 (jdbc:sqlserver://winny\SQLEXPRESS:1433;databaseName=vha) で示されています。IP アドレスを試しましたか? (jdbc:sqlserver://192.168.99.132\SQLEXPRESS:1433;データベース名=vha)

私が通常試していること:

  1. ポートを確認します -- ホスト マシンの localhost ポート 1433 に telnet で接続できますか
  2. ネットワークを確認してください -- ホストが ping に応答することを確認してください -- クライアントから名前で ping を実行できますか? IPアドレスで?
  3. ポート 1433 が開いていることを確認します。ポート 1433 でクライアントからホストに telnet できますか?

jTDS を使用して Mac クライアントから接続できるため、これら 3 つすべてを既に実行できるはずですが、再確認する価値があります。

サーバーでポート 1433 をハードコーディング (空白から変更) することもできます。SQL の別のインスタンスが存在する可能性があります。http://support.microsoft.com/kb/287932も参照してください。

私が通常行ういくつかの手順を次に示します。おそらくこれが役立ちます。

  1. (サーバー) SSMS を開き、SQL Server、プロパティを右クリックします。[リモート接続を許可する] がオンになっていることを確認します。そうでない場合は、SQL Server を確認して再起動します。
  2. (サーバー) SQL Server 構成マネージャーを開きます ([スタート] -> [SQL Server] -> [構成ツール])。
    1. TCP/IP が有効になっていることを確認する
    2. デフォルト インスタンスの場合、静的ポート 1433 が設定されていることを確認します (注: 名前付きインスタンスには MYSQLSERVER\MYINSTANCE のようにバックスラッシュが付きますが、デフォルト インスタンスはサーバー名だけで識別されます)。
    3. 名前付きインスタンスの場合、別の静的ポート (1434+ など) を選択し、それを静的ポートとして設定します。インスタンスごとに 1 つだけ - 同じマシンで再利用しないでください。
    4. SQL Server サービスを再起動します
  3. (サーバー) これまでの作業が機能したことを確認します。SQL Server マシン上:
    1. CMD プロンプト「telnet localhost 1433」を開きます (必要に応じて 1433 を他のポート番号に変更します)。
      1. 「ハング」した空白の画面が表示された場合は、うまくいきました。
      2. エラーが発生した場合は、機能していません。スクエア1に戻ります。
    2. ローカルホストの代わりにマシン名を使用して、同じことを試してください
  4. (サーバー) Windows ファイアウォールを構成して、TCP ポート 1433 (または手順 2 で選択したポート) に例外を追加します。
  5. (サーバー) 名前付きインスタンスを使用する場合は、UDP ポート 1433 にも別の例外を追加します (TCP ではなく UDP を使用する SQL Browser サービスの場合 – インスタンスに別の TCP ポートを選択した場合でも、SQL Browser サービスは常にポート 1433 を使用することに注意してください)。手順 2)
  6. (クライアント) 同じネットワーク上の別のマシンから確認する
    1. CMD プロンプト「ping」を開きます。応答があれば、マシンは互いに認識できます。応答が得られない場合でも、次の手順を試してください。たとえば、Windows 7 ではデフォルトでエコー要求 (ping) に応答しない場合があります。
    2. CMD プロンプト「telnet 1433」を開きます (必要に応じて 1433 を他のポート番号に変更します)。
      1. 「ハング」した空白の画面が表示された場合は、うまくいきました。
      2. エラーが発生した場合は、機能していません。スクエア1に戻ります。
  7. (クライアント) 次に、Excel などの別のアプリケーションから SQL Server に接続してみます
  8. (クライアント) http://blogs.msdn.com/b/dataaccesstechnologies/archive/2010/01/29/testing-connection-to-sql-server-from-a-service-running-under-local-systemも参照してください。 -account.aspx (その他のエラー)
于 2013-01-15T06:04:08.437 に答える