数据库中 Id 列是自动增长;
运用 java 语句向数据库中插入一条数据,并返回这条数据的 ID
我使用的是 SQLServer 数据库。
在查询分析器中可以使用 SELECT SCOPE_IDENTITY() 能够得到刚刚插入数据的 ID
可是在 java 中使用这条语句却无法得到正确结果。
以下是我的代码:String sql = "insert into communityGTTitle values(?)";
String sql2 = "SELECT SCOPE_IDENTITY() as temp";
String username = "username";Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databaseName=A_Hospital","hello","hello");
PreparedStatement ps = null;
PreparedStatement ps2 = null;
ResultSet rs = null;
try{
ps = con.prepareStatement(sql);
ps.setString(1, username );
ps.execute();
ps2 = con.prepareStatement(sql2);
rs = ps2.executeQuery();
rs.next();
System.out.println(rs.getInt("temp"));
}catch(Exception exception){
exception.printStackTrace();
}这样并不能得到正确的结果,输出的结果一直是 0
请求高手指教
运用 java 语句向数据库中插入一条数据,并返回这条数据的 ID
我使用的是 SQLServer 数据库。
在查询分析器中可以使用 SELECT SCOPE_IDENTITY() 能够得到刚刚插入数据的 ID
可是在 java 中使用这条语句却无法得到正确结果。
以下是我的代码:String sql = "insert into communityGTTitle values(?)";
String sql2 = "SELECT SCOPE_IDENTITY() as temp";
String username = "username";Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databaseName=A_Hospital","hello","hello");
PreparedStatement ps = null;
PreparedStatement ps2 = null;
ResultSet rs = null;
try{
ps = con.prepareStatement(sql);
ps.setString(1, username );
ps.execute();
ps2 = con.prepareStatement(sql2);
rs = ps2.executeQuery();
rs.next();
System.out.println(rs.getInt("temp"));
}catch(Exception exception){
exception.printStackTrace();
}这样并不能得到正确的结果,输出的结果一直是 0
请求高手指教
pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS); // 这句的参数是关键
setPreparedStatementValue(pstat, base);
if (pstat.executeUpdate() == 1) {
rs = pstat.getGeneratedKeys(); // 用来获得生成的数值
if (rs.next()) {
long newId = Long.parseLong(rs.getString(1)); // 拿到数值
}
}from: http://www.java2000.net/viewthread.jsp?tid=367
SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。 IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。
Statement st=con.createStatement();
String sql="insert ... into ....";
st.execute(sql);
rs=st.excute("SELECT SCOPE_IDENTITY()");具体代码我现在没有,单应该就是真么做的
你给的代码 pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS);
这句总是报以下这个异常啊!搞了半天弄不出来,只能在请教了!
Exception in thread "main" java.lang.AbstractMethodError: com.microsoft.jdbc.sqlserver.SQLServerConnection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;
这句执行完之后,检验一下数据库里有数据了么.
看看ps.executeUpdate()
可以试试用存储过程插入后直接获取
伪码:把插入sql写成存储过程,@identity 在返回参数中取得,返回参数加output.
CREATE PROCEDURE
(
@ID numeric(9,0) output,
其他要插入的参数
)
AS
BEGIN
INSERT INTO ……
SELECT @ID=@@identity --取得identity
……
end
调用时用CallableStatement,
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.executeUpdate();
ID = cstmt.getInt(1);
该ID就是刚刚插入的identity.