Open
Description
Driver version
12.8.1
SQL Server version
Microsoft SQL Server 2019 (RTM-CU29) (KB5046365) - 15.0.4405.4 (X64)
Oct 23 2024 08:45:19
Copyright (C) 2019 Microsoft Corporation
Developer Edition (64-bit) on Linux (Ubuntu 20.04.6 LTS) <X64>
Client Operating System
openSUSE Leap 15.6 x86_64
JAVA/JVM version
java version 22
Problem description
PreparedStatement.executeBatch(), when the insert sql column name case mismatch, Throws SQLServerException "Unable to retrieve column metadata."
-
create table, c1 lower case.
CREATE TABLE varchartable1 (c1 varchar(10))
-
executeBatch
Column name use lower case
c1
, succeed
con.prepareStatement("INSERT INTO varchartable1 (c1) VALUES(?)")
Column name use upper case
C1
, throws SQLServerException "Unable to retrieve column metadata."
con.prepareStatement("INSERT INTO varchartable1 (C1) VALUES(?)")
The unit tests.
- succeed
@Test
public void testExecuteBatchColumnCaseMatching() throws Exception {
String varcharTable1 = AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("varchartable1"));
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
try (Connection con = DriverManager.getConnection(connectionString
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
try (Statement statement = con.createStatement()) {
TestUtils.dropTableIfExists(varcharTable1, statement);
String createSql = "CREATE TABLE" + varcharTable1 + " (c1 varchar(10))";
statement.execute(createSql);
}
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + varcharTable1 + "(c1) VALUES(?)")) {
preparedStatement.setObject(1, "value1");
preparedStatement.addBatch();
preparedStatement.setObject(1, "value2");
preparedStatement.addBatch();
preparedStatement.executeBatch();
}
}
}
- throws SQLServerException "Unable to retrieve column metadata."
@Test
public void testExecuteBatchColumnCaseMismatch() throws Exception {
String varcharTable1 = AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("varchartable1"));
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
try (Connection con = DriverManager.getConnection(connectionString
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
try (Statement statement = con.createStatement()) {
TestUtils.dropTableIfExists(varcharTable1, statement);
String createSql = "CREATE TABLE" + varcharTable1 + " (c1 varchar(10))";
statement.execute(createSql);
}
// upper case C1
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + varcharTable1 + "(C1) VALUES(?)")) {
preparedStatement.setObject(1, "value1");
preparedStatement.addBatch();
preparedStatement.setObject(1, "value2");
preparedStatement.addBatch();
try {
preparedStatement.executeBatch();
fail("Should have failed");
} catch (Exception ex) {
assertInstanceOf(SQLServerException.class, ex);
assertEquals("Unable to retrieve column metadata.", ex.getMessage());
}
}
}
}
Metadata
Metadata
Assignees
Labels
No labels
Type
Projects
Status
Under Peer Review
Activity
wooln commentedon Feb 1, 2025
Database use a case-sensitive (like SQL_Latin1_General_CP1_CS_AS) and a table like this
create table [Test1] ([C1] int, [c1] varchar)
I covered the unit tests that use both columns c1 and C1, and an exception occurred, indicating that no one has ever covered CS before.