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、ライブラリ。１つのjarファイルでできており、このファイルにはデータベースを管理するためのインターフェースやクラスが入っている 。今回の場合Eclipseの動的Webプロジェクトで使用するのでWEB-INF/lib下に配置する(=自動的にクラスパスに追加される) 。

###JDBCドライバをインストールする
- SQL server用のJDBCドライバを(日本語版を選び)インストール。
https://www.microsoft.com/en-us/download/details.aspx?id=55539

- /(パッケージ名)/WebContent/WEB-INF/lib 下に配置(今回追加したのはmssql-jdbc-6.2.2.jre8.jar)。

![JDBCドライバ配置場所.png](https://qiita-image-store.s3.amazonaws.com/0/210223/156bd2d6-b031-377b-8c0f-b64466027444.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](https://qiita-image-store.s3.amazonaws.com/0/210223/45e6127c-5127-b703-cce7-759337d84947.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](https://qiita-image-store.s3.amazonaws.com/0/210223/7bb08170-b33d-8b15-0ddb-f8a21b282f49.png)

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