Java 不支持游标类型/并发组合
在使用ResultSet、PreparedStatement和Microsoft JDBC驱动程序(版本:6.0)后,我遇到了ResultSet错误。错误消息是: 线程“main”com.microsoft.sqlserver.jdbc.SQLServerException中出现异常:不支持游标类型/并发组合 我的代码如下: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
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();
}
}
在发布这个问题之前,我已经阅读了文章。但我仍然不明白两点:
非常感谢。您将可更新的
结果集
用于选择
查询,而不是插入
你什么都用错了。在调用executeUpdate()
之前,只需按您现在使用的方式使用insert(无任何特殊参数),并使用setInt
等设置参数
如果要使用可更新的
结果集
,请将一些数据放入数据库中,选择它们,然后使用rs.updateRow()
样式。您使用可更新的结果集
进行选择
查询,而不是使用插入
你什么都用错了。在调用executeUpdate()
之前,只需按您现在使用的方式使用insert(无任何特殊参数),并使用setInt
等设置参数
如果要使用可更新的
结果集
,请在数据库中放入一些数据,选择它们,然后使用rs.updateRow()
样式。您混合了两种不同的方法将数据插入数据库:
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();
}
将数据插入数据库的方法有两种:
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");
}
}
也许他错了。本教程应该没问题。但是这个“答案”是问题的一部分,所以请编辑你的问题并附加这个。这个教程应该可以。但此“答案”是问题的一部分,因此请编辑您的问题并附加此。