Java 不支持游标类型/并发组合

Java 不支持游标类型/并发组合,java,jdbc,cursor,prepared-statement,resultset,Java,Jdbc,Cursor,Prepared Statement,Resultset,在使用ResultSet、PreparedStatement和Microsoft JDBC驱动程序(版本:6.0)后,我遇到了ResultSet错误。错误消息是: 线程“main”com.microsoft.sqlserver.jdbc.SQLServerException中出现异常:不支持游标类型/并发组合 我的代码如下: public void usePreparedStatement_ResultSet_01() throws SQLException, ClassNotFound

在使用ResultSet、PreparedStatement和Microsoft JDBC驱动程序(版本:6.0)后,我遇到了ResultSet错误。错误消息是:

线程“main”com.microsoft.sqlserver.jdbc.SQLServerException中出现异常:不支持游标类型/并发组合

我的代码如下:

    public void usePreparedStatement_ResultSet_01() throws SQLException, ClassNotFoundException {
    Class.forName(driver);

    try(
            Connection connectDB = DriverManager.getConnection(url+databaseName+user+password);
            PreparedStatement pstmt = connectDB.prepareStatement("insert into person values(?,?,?)"
                                      , ResultSet.TYPE_SCROLL_INSENSITIVE
                                      , ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = pstmt.executeQuery()) {

        rs.next();
        rs.updateInt(1, 1005);
        rs.updateString(2,"boy"+3);
        rs.updateInt(3, 25);
        rs.updateRow();

    }
}

public static void main(String [] argv) throws IOException, FileNotFoundException, SQLException,                                               ClassNotFoundException {

    useResultSet_01 insertDBbyResultSet = new useResultSet_01();
    insertDBbyResultSet.useConfig("D:\\Dropbox\\coding\\practices\\JAVA8-II_JDBC\\configTest1.txt");
    insertDBbyResultSet.usePreparedStatement_ResultSet_01();
    }
}
在发布这个问题之前,我已经阅读了文章。但我仍然不明白两点:

  • 为什么即使使用PreparedStatement,也不能使用“executeUpdate”
  • 如果我想使用PreparedStatement和ResultSet,比如代码中的写入行,那么如何更新数据库

  • 非常感谢。

    您将可更新的
    结果集
    用于
    选择
    查询,而不是
    插入

    你什么都用错了。在调用
    executeUpdate()
    之前,只需按您现在使用的方式使用insert(无任何特殊参数),并使用
    setInt
    等设置参数


    如果要使用可更新的
    结果集
    ,请将一些数据放入数据库中,选择它们,然后使用
    rs.updateRow()
    样式。

    您使用可更新的
    结果集
    进行
    选择
    查询,而不是使用
    插入

    你什么都用错了。在调用
    executeUpdate()
    之前,只需按您现在使用的方式使用insert(无任何特殊参数),并使用
    setInt
    等设置参数


    如果要使用可更新的
    结果集
    ,请在数据库中放入一些数据,选择它们,然后使用
    rs.updateRow()
    样式。

    您混合了两种不同的方法将数据插入数据库:

  • 这仅在SQL查询返回结果集时有效,例如,当您执行
    SELECT

    try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
        ResultSet uprs = stmt.executeQuery("SELECT * FROM person");
    
        uprs.moveToInsertRow();
    
        uprs.updateInt(1, 1005);
        uprs.updateString(2,"boy"+3);
        uprs.updateInt(3, 25);
    
        uprs.insertRow();
        uprs.beforeFirst();
    } catch (SQLException e ) {
        e.printStackTrace();
    }
    
    注意:并非所有JDBC驱动程序和数据库都支持并发。如果驱动程序支持指定的并发级别,则方法DatabaseMetaData.supportsResultSetConcurrency返回true,否则返回false

  • 带有
    PreparedStatement

    try(
            Connection connectDB = DriverManager.getConnection(url+databaseName+user+password);
            PreparedStatement pstmt = connectDB.prepareStatement("insert into person values(?,?,?)")
        ) {
    
        pstmt.setInt(1, 1005);
        pstmt.setString(2,"boy"+3);
        pstmt.setInt(3, 25);
        pstmt.executeUpdate();
    }
    

  • 将数据插入数据库的方法有两种:

  • 这仅在SQL查询返回结果集时有效,例如,当您执行
    SELECT

    try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
        ResultSet uprs = stmt.executeQuery("SELECT * FROM person");
    
        uprs.moveToInsertRow();
    
        uprs.updateInt(1, 1005);
        uprs.updateString(2,"boy"+3);
        uprs.updateInt(3, 25);
    
        uprs.insertRow();
        uprs.beforeFirst();
    } catch (SQLException e ) {
        e.printStackTrace();
    }
    
    注意:并非所有JDBC驱动程序和数据库都支持并发。如果驱动程序支持指定的并发级别,则方法DatabaseMetaData.supportsResultSetConcurrency返回true,否则返回false

  • 带有
    PreparedStatement

    try(
            Connection connectDB = DriverManager.getConnection(url+databaseName+user+password);
            PreparedStatement pstmt = connectDB.prepareStatement("insert into person values(?,?,?)")
        ) {
    
        pstmt.setInt(1, 1005);
        pstmt.setString(2,"boy"+3);
        pstmt.setInt(3, 25);
        pstmt.executeUpdate();
    }
    

  • 多谢各位。我所用的参考资料是从书中得来的“細說中国作家李刚的《JAVA 8》。这是他的密码:

        import java.util.*;
    import java.io.*;
    import java.sql.*;
    public class ResultSetTest
    {
        private String driver;
        private String url;
        private String user;
        private String pass;
        public void initParam(String paramFile)throws Exception
        {
            Properties props = new Properties();
            props.load(new FileInputStream(paramFile));
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            pass = props.getProperty("pass");
        }
        public void query(String sql)throws Exception
        {
            Class.forName(driver);
            try(
                Connection conn = DriverManager.getConnection(url , user , pass);
                PreparedStatement pstmt = conn.prepareStatement(sql
                    , ResultSet.TYPE_SCROLL_INSENSITIVE
                    , ResultSet.CONCUR_UPDATABLE);
                **ResultSet rs = pstmt.executeQuery())
            {
                rs.last();
                int rowCount = rs.getRow();
                for (int i = rowCount; i > 0 ; i-- )
                {
                    rs.absolute(i);
                    System.out.println(rs.getString(1) + "\t"
                        + rs.getString(2) + "\t" + rs.getString(3));
                    rs.updateString(2 , "studentName" + i);
                    rs.updateRow();**
                }
            }
        }
        public static void main(String[] args) throws Exception
        {
            ResultSetTest rt = new ResultSetTest();
            rt.initParam("mysql.ini");
            rt.query("select * from student_table");
        }
    }
    

    也许他错了。

    谢谢。我所用的参考资料是从书中得来的“細說中国作家李刚的《JAVA 8》。这是他的密码:

        import java.util.*;
    import java.io.*;
    import java.sql.*;
    public class ResultSetTest
    {
        private String driver;
        private String url;
        private String user;
        private String pass;
        public void initParam(String paramFile)throws Exception
        {
            Properties props = new Properties();
            props.load(new FileInputStream(paramFile));
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            pass = props.getProperty("pass");
        }
        public void query(String sql)throws Exception
        {
            Class.forName(driver);
            try(
                Connection conn = DriverManager.getConnection(url , user , pass);
                PreparedStatement pstmt = conn.prepareStatement(sql
                    , ResultSet.TYPE_SCROLL_INSENSITIVE
                    , ResultSet.CONCUR_UPDATABLE);
                **ResultSet rs = pstmt.executeQuery())
            {
                rs.last();
                int rowCount = rs.getRow();
                for (int i = rowCount; i > 0 ; i-- )
                {
                    rs.absolute(i);
                    System.out.println(rs.getString(1) + "\t"
                        + rs.getString(2) + "\t" + rs.getString(3));
                    rs.updateString(2 , "studentName" + i);
                    rs.updateRow();**
                }
            }
        }
        public static void main(String[] args) throws Exception
        {
            ResultSetTest rt = new ResultSetTest();
            rt.initParam("mysql.ini");
            rt.query("select * from student_table");
        }
    }
    

    也许他错了。

    本教程应该没问题。但是这个“答案”是问题的一部分,所以请编辑你的问题并附加这个。这个教程应该可以。但此“答案”是问题的一部分,因此请编辑您的问题并附加此。