パラメーターを設定するために java.sql.Time オブジェクトまたは java.sql.Types.TIME JDBC 型を使用する場合、サーバーに java.sql.Time 値をどのように ( の SQL Server time 型として、または datetime 型として) 送信するかを構成することができます。
次のいずれかのメソッドを使用するケースが、このシナリオに該当します。
- SQLServerCallableStatement.registerOutParameter(int, int)
- SQLServerCallableStatement.registerOutParameter(int, int, int)
- SQLServerCallableStatement.setTime
- SQLServerPreparedStatement.setTime
- SQLServerCallableStatement.setObject
- SQLServerPreparedStatement.setObject
SendTimeAsDatetime
java.sql.Time 値の送信方法を構成するには sendTimeAsDatetime 接続プロパティを使用します。 詳細については、「接続プロパティの設定」を参照してください。
sendTimeAsDatetime 接続プロパティの値は、SQLServerDataSource.setSendTimeAsDatetime を使用してプログラムから変更できます。
SQL Server 2008 (10.0.x) より前のバージョンの SQL Server では、time データ型がサポートされていないため、java.sql.Time を使用するアプリケーションでは通常、java.sql.Time 値が datetime または smalldatetime SQL Server データ型として格納されます。
java.sql.Time 値を扱う際に SQL Server の datetime 型および smalldatetime 型を使用する場合は、sendTimeAsDatetime 接続プロパティを true に設定する必要があります。 java.sql.Time 値を操作するときに time SQL Server データ型を使用する場合は、sendTimeAsDatetime 接続プロパティを false に設定する必要があります。
日付と時刻の両方を格納できるパラメーターに java.sql.Time 値を送信すると、java.sql.Time 値の送信方法によって、既定の日付は異なります。datetime 値として送信された場合は 1/1/1970 に、time 値として送信された場合は 1/1/1900 になります。 SQL Server にデータを送信する際のデータ変換の詳細については、「日時データの使用」を参照してください。
SQL Server JDBC Driver 3.0 では、sendTimeAsDatetime は既定で true となります。 今後のリリースでは、sendTimeAsDatetime 接続プロパティの既定値が false になる予定です。
アプリケーションの動作が sendTimeAsDatetime 接続プロパティの既定値に左右されないようにするための対策としては、次のような方法があります。
- SQL Server の time データ型を使用する場合は java.sql.Time を使用する。
- datetime、smalldatetime、および datetime2SQL Server データ型を操作する場合は、java.sql.Timestamp を使用する。
暗号化された列では time から datetime への変換がサポートされないため、暗号化された列では SendTimeAsDatetime が false である必要があります。 Microsoft JDBC Driver 6.0 for SQL Server 以降では、SQLServerConnection クラスには、sendTimeAsDatetime プロパティの値を設定および取得するための次の 2 つのメソッドがあります。
public boolean getSendTimeAsDatetime()
public void setSendTimeAsDatetime(boolean sendTimeAsDateTimeValue)