Java
SQLServer
DB接続

Javaプログラムからデータベース(SQL Server 2014)を利用する 2018/01/04

javaプログラムとDB(SQL Server 2014)を接続する

環境

  • java 8
  • eclipse
  • SQL server 2014

javaプログラムからDBを利用するために必要なもの

①java.sqlパッケージ---インポートして利用。特に特別な用意必要なし。
②JDBCドライバ--- java DataBase Connector、ライブラリ。1つのjarファイルでできており、このファイルにはデータベースを管理するためのインターフェースやクラスが入っている 。今回の場合Eclipseの動的Webプロジェクトで使用するのでWEB-INF/lib下に配置する(=自動的にクラスパスに追加される) 。

JDBCドライバをインストールする

JDBCドライバ配置場所.png

SQL接続用プログラムを書く

http://www.codejava.net/java-se/jdbc/connect-to-microsoft-sql-server-via-jdbc
を参考にしながら
Windows認証でログインするプログラムを実行しようとすると
com.microsoft.sqlserver.jdbc.SQLServerException: ユーザー '' はログインできませんでした。
とエラーが出たので、SQL認証でログインを試みると下記コードで接続が無事成功。

************************ここから
```
package (パッケージ名);

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Practicing {

// ドライバが読み込まれているかの確認
// public static void main(String[] args) throws InstantiationException,
// IllegalAccessException {
// String msg = "";
// try {
// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
// msg = "ドライバのロードに成功しました";
// } catch (ClassNotFoundException e){
// msg = "ドライバのロードに失敗しました";
// }
// System.out.println(msg);
// }

public static void main(String[] args) {

    Connection conn = null;

    try {

        String dbURL = "jdbc:sqlserver://localhost\\sqlexpress";
        String user = "sa";
        String pass = "*****(SQL serverインストール時に設定したパスワード)";
        conn = DriverManager.getConnection(dbURL, user, pass);

        if (conn != null) {
            DatabaseMetaData dm = (DatabaseMetaData) conn.getMetaData();
            System.out.println("Driver name: " + dm.getDriverName());
            System.out.println("Driver version: " + dm.getDriverVersion());
            System.out.println("Product name: " + dm.getDatabaseProductName());
            System.out.println("Product version: " + dm.getDatabaseProductVersion());
        }

    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

}
```
***********************ここまで
実行結果:
実行結果.png

追記:
ある日このプログラムを実行すると下記エラーが出る。

com.microsoft.sqlserver.jdbc.SQLServerException: The connection to the host localhost, named instance sqlexpress failed. Error: "java.net.SocketTimeoutException: Receive timed out". Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434. For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:227)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:5241)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:1916)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1669)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1528)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:866)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:569)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at chkJDBC.ListPracticing.main(ListPracticing.java:34)

このメッセージの中に、「For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host」、SQL Server 2005以降のものを使用している場合は、SQL Server Browserが起動していることを確認してください、とある。

サービスにて、SQL Server(インスタンス名、この場合SQLEXPRESS)とSQL Server Browserどちらも実行されていることを確認する。
今回Server Browserのほうが起動していなかった。
スタート>サービス>該当する以下2つ、「実行中」となっていなければ右クリック、「開始」
SQLwhenError.png

もう一度プログラム実行すると、無事実行できた!