Я использую среду Spring Batch в своем продукте. Это чтение некоторых данных из базы данных mssqlserver, обработка данных и обновление обработанных данных в той же таблице с использованием первичного ключа в предложенииwhere. Драйвер mssql-jdbc появляется для связи с базами данных.
Это схема моей таблицы Таблица образцов CREATE TABLE( col1 datetime NOT NULL первичный ключ, col2 варчар(50), col3 варчар(50) )
Это данные в моей таблице
col1 |col2 |col3
2024-04-28 20:18:43.703 name lastname
И когда Spring Framework выполняет запрос на обновление, то на стороне базы данных в профилировщике sqlserver ниже выполняется запрос.
exec sp_executesql N'update sampletable set col2=@P0 where col1=@P1 ',N'@P0 nvarchar(4000),@P1 datetime2',N'xxxxxxx','2024-04-28 20:18:43.7030000'
И он не обновляет ни одну строку, поскольку «2024-04-28 20:18:43.7030000» не соответствует «2024-04-28 20:18:43.703» после неявного преобразования.
Мы знаем о «Начиная с SQL Server 2016, процесс преобразования/сравнения datetime в datetime2 (и наоборот) был изменен.»
Мы также попытались привести значение datetime к datetime2 и передать запрос, но это тоже не помогло. Это запрос, который мы создали после приведения
exec sp_executesql N'update sampletable set col2=@P0 where col1=@P1 ',N'@P0 nvarchar(4000),@P1 datetime2',N'xxxxxxx','2024-04-28 20:18:43.7033333'
Есть ли какой-нибудь способ остановить это преобразование datetime в datetime2 при выполнении с использованием jdbc в sqlserver.
Пожалуйста, Прочтите перед публикацией.... (Запрос exec sp_executesql ... '2024-04-28 20:18:43.7033333'
упоминается два раза с разным описанием)
@siggemannen да, не совпадает
@Luuk да, я знаю об этом. Я прочитал свой вопрос, и здесь нет никакой двусмысленности.
Интересная проблема, я думаю, вы можете использовать следующее исправление github.com/microsoft/mssql-jdbc/pull/1687, чтобы использовать datetimeParameterType в строке подключения, чтобы использовать datetime вместо datetime2, что должно решить вашу проблему.
@siggemannen, это не сработало. Моя строка подключения = "jdbc:sqlserver://localhost:port;databaseName=dbname;datetimeParameterType=datetime" И я попробовал с mssql-jdbc-12.2.0.jre8.jar и mssql-jdbc-12.6.0 .jre8.jar. Проблема все еще сохраняется.
@siggemannen, это сработало, спасибо за помощь. Когда я перепроверил все, я обнаружил, что новые драйверы не отображаются.
Это работает в 12.2.0:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import org.junit.Test;
public class JDBCTest
{
@Test
public void testJdbc_default() throws Exception
{
Connection c = DriverManager
.getConnection(
"jdbc:sqlserver://localhost;databaseName=;integratedSecurity=true;"
+ "encrypt=false;lastUpdateCount=false;");
PreparedStatement ps = c.prepareStatement("select convert(varchar(30), ?, 121)");
ps.setTimestamp(1, Timestamp.valueOf("2024-04-28 20:18:43.703"));
ps.execute();
ResultSet rs = ps.getResultSet();
rs.next();
System.out.println(rs.getString(1)); //2024-04-28 20:18:43.7030000
}
@Test
public void testJdbc_datetime() throws Exception
{
Connection c = DriverManager
.getConnection(
"jdbc:sqlserver://localhost;databaseName=;integratedSecurity=true;"
+ "encrypt=false;lastUpdateCount=false;datetimeParameterType=datetime");
PreparedStatement ps = c.prepareStatement("select convert(varchar(30), ?, 121)");
ps.setTimestamp(1, Timestamp.valueOf("2024-04-28 20:18:43.703"));
ps.execute();
ResultSet rs = ps.getResultSet();
rs.next();
System.out.println(rs.getString(1)); //2024-04-28 20:18:43.703
}
@Test
public void testJdbc_datetime2() throws Exception
{
Connection c = DriverManager
.getConnection(
"jdbc:sqlserver://localhost;databaseName=;integratedSecurity=true;"
+ "encrypt=false;lastUpdateCount=false;datetimeParameterType=datetime2");
PreparedStatement ps = c.prepareStatement("select convert(varchar(30), ?, 121)");
ps.setTimestamp(1, Timestamp.valueOf("2024-04-28 20:18:43.703"));
ps.execute();
ResultSet rs = ps.getResultSet();
rs.next();
System.out.println(rs.getString(1)); //2024-04-28 20:18:43.703000
}
}
Пом:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.2.0.jre8</version>
</dependency>
Может быть, у вас происходит что-то еще?
Вы уверены? почему оно не будет соответствовать после неявного преобразования