我有以下代码,我将记录插入表中。当我尝试获取结果集时,它返回null。如何将最新添加的行添加到结果集中?
String sql1 = "INSERT INTO [xxxx].[dbo].[xxxxxx](WORKFLOW_SEQ_NBR," +
" WORKFLOW_LOG_TYPE_CODE, WORKFLOW_STATUS_CODE, DISP_CODE, DISP_USER, DISP_COMMENT, DISP_TITLE, DISP_TS)" +
"VALUES(?,?,?,?,?,?,?,?)";
PreparedStatement pst = connect.prepareStatement(sql1);
pst.setString(1, ...);
pst.setString(2, ...);
...
...
...
pst.executeUpdate();
ResultSet rstest = pst.executeQuery();
// ResultSet rstest = pst.getResultSet();
编辑:已解决
添加以下方法转到最后添加的行
st.execute("Select * from [xxxx].[dbo].[xxxxxxxxx]");
ResultSet rstest = st.getResultSet();
rstest.afterLast();
GETLASTINSERTED:
while(rstest.previous()){
System.out.println(rstest.getObject(1));
break GETLASTINSERTED;//to read only the last row
}
答案 0 :(得分:6)
使用INSERT
,UPDATE
或DELETE
等PreparedStatement
等SQL语句时,必须使用executeUpdate
,这将返回感伤的行。在这种情况下,sql操作不会产生ResultSet
,因此调用executeQuery会抛出SQLException
。
如果您确实需要ResultSet
,则必须使用SELECT
SQL操作创建另一个语句。
请参阅PreparedStatement#executeQuery和PreparedStatement#executeUpdate
的javadoc答案 1 :(得分:1)
Connection#prepareStatement() - 创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
表示connect.prepareStatement(sql1);
使用插入查询创建了PreparedStatement对象。
当你执行pst.executeUpdate();
时,它将返回SQL数据操作语言(DML)语句的行计数,或者返回0表示不返回任何内容的SQL语句
现在,如果您再次想要获取插入的数据,则需要使用Select query创建一个新的PreparedStatement对象。
PreparedStatement pstmt = connect.prepareStatement("SELECT * FROM tableName");
然后,它将为您提供包含查询
生成的数据的ResultSet对象ResultSet rstest = pstmt.executeQuery();
答案 2 :(得分:0)
似乎这是一个较旧的问题,但是我正在寻找类似的解决方案,因此也许人们仍然会需要这个。
如果要执行插入语句,则可以使用Connection.PreparedStatement(String,String [])构造函数,然后使用ps.getGeneratedKeys()将其分配给ResultSet。
它看起来像这样:
public void sqlQuery() {
PreparedStatement ps = null;
ResultSet rs = null;
Connection conn; //Assume this is a properly defined Connection
String sql = "select example from examples";
ps = conn.prepareStatement(sql, new String[]{"example"});
//do anything else you need to do with the preparedStatement
ps.execute;
rs = ps.getGeneratedKeys();
while(rs.next()){
//do whatever is needed with the ResultSet
}
ps.close();
rs.close();
}