使用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();
}
}
我在发布此问题之前已经阅读了这些文章。但我仍然不理解两点:
非常感谢。
答案 0 :(得分:0)
您使用带有ResultSet
查询的可更新SELECT
,而不是INSERT
。
你正在使用一切错误。只需使用插入即可立即使用(无任何特殊参数),并在调用setInt
之前使用executeUpdate()
等设置参数。
如果要使用可更新的ResultSet
,请将一些数据放入数据库,选择它们,然后使用rs.updateRow()
样式。
答案 1 :(得分:0)
您将两种不同的方法混合到数据库中:
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。
使用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");
}
}
也许他错了。