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

时间:2017-10-23 08:46:04

标签: java jdbc cursor prepared-statement resultset

使用ResultSet,PreparedStatement和Microsoft JDBC Driver(版本: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();
    }
}

我在发布此问题之前已经阅读了这些文章。但我仍然不理解两点:

  1. 为什么我不能使用" executeUpdate"甚至我使用PreparedStatement?
  2. 如果我想将PreparedStatement与ResultSet一起使用,如我的代码中的书写行,我该如何更新我的数据库。
  3. 非常感谢。

3 个答案:

答案 0 :(得分:0)

您使用带有ResultSet查询的可更新SELECT,而不是INSERT

你正在使用一切错误。只需使用插入即可立即使用(无任何特殊参数),并在调用setInt之前使用executeUpdate()等设置参数。

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

答案 1 :(得分:0)

您将两种不同的方法混合到数据库中:

  1. Inserting Rows in ResultSet Objects

    仅当SQL-Query返回ResultSet时才有效,例如当您执行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。

  2. 使用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();
    }
    

答案 2 :(得分:0)

谢谢。我使用的参考文献来自中国作者“李刚”的“细说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");
    }
}

也许他错了。