-
Couldn't load subscription status.
- Fork 13k
Updated rows is not returned #2802
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
In the PreparedStatementHandler the execute function is used and afterwards the getUpdateCount is used. However in my case (Sybase) the updateCount returns zero. The two statements can be combined to 1; executeUpdate which returns the correct result.
Hello @koekj ,
Changing to executeUpdate has side effects and we cannot do that.
I just tested and the following test passes.
So, there may be something wrong with your code or config (if the driver really return 0, it would be a driver bug).
If you need further help, please provide information to reproduce the issue.
import static org.junit.jupiter.api.Assertions.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import org.junit.jupiter.api.Test; import net.harawata.jdbc.connection.JdbcConnection; class SybaseTest { @Test void test() throws Exception { Class.forName("com.sybase.jdbc42.jdbc.SybDriver"); String url = "jdbc:sybase:Tds:192.168.60.8:5000?serviceName=TEST"; String username = "xxx"; String password = "xxx"; try (Connection con = DriverManager.getConnection(url, username, password)) { try (Statement st = con.createStatement()) { st.execute("drop TABLE test "); } catch (SQLException e) { // } try (Statement st = con.createStatement()) { st.execute("CREATE TABLE test (id int, t varchar(20))"); st.execute("insert into test (id, t) values (1, 'val')"); } try (PreparedStatement stmt = con.prepareStatement("update test set t = ? where id = ?")) { stmt.setString(1, "val2"); stmt.setInt(2, 1); assertFalse(stmt.execute()); assertEquals(1, stmt.getUpdateCount()); } } } }
- DB version : Adaptive Server Enterprise 16.0.03.02
- Driver version : jConnect (TM) for JDBC(TM)/16.0 SP04 (Build 27487)/P/EBF29603/JDK 1.8.0/jdbc42dev/OPT/Mon Nov 9 19:10:17 PST 2020
Ok, I will check this; I'm using spring boot in combination with mybatis.
It seems that you are right; the driver I'm currently using is not given the correct answer which is
jConnect (TM) for JDBC(TM)/16.0 SP03 PL08 (Build 27463)/P/EBF29225/JDK 1.6.0/jdbcdev/OPT/Sun Jan 12 19:56:00 PST 2020
I will try the get hold on the latest jconn4 driver from sybase/sap.
Hi,
I tested it with the jconn42.jar
jConnect (TM) for JDBC(TM)/16.0 SP04 PL03 (Buil
d 27530)/P/EBF30373/JDK 1.8.0/jdbcsp04/OPT/Sun Jul 31 19:17:02 PDT 20
22
using java 17 but it doesn't seem to be working. The updateCount returns still zero, when I use the executeUpdate it returns the correct value which is 1.
assert stmt.execute() == false;
int rows = stmt.getUpdateCount();
assert rows == 1; <== returns zero
int _rows = stmt.executeUpdate();
assert _rows == 1; <== returns 1.
And the statement is very simple I'm using update x set nm=nm where relation=1 and nr=1;
Oh, by the way, if the issue is reproducible with a plain JDBC code (i.e. without MyBatis) like the one I posted, please paste it.
I use an existing database where I'm not the "super user" so I have to see if I can setup a local database for reproduction. Did you use a docker image to get the database up and running as that would help me to speed up the reproduction.
Last time checked, there was no official docker image, so I had to install express edition or something on my VirtualBox VM.
@SAP 👎
Ok clear. I will do the same then.
guoweixin
commented
Apr 4, 2023
看到了,
In the PreparedStatementHandler the execute function is used and afterwards the getUpdateCount is used. However in my case (Sybase) the updateCount returns zero. The two statements can be combined to 1; executeUpdate which returns the correct result.