30. august 2008 - 17:45
Der er
7 kommentarer og 1 løsning
DB - Udførsel af proc. med flere select statements
Jeg er vant til at kommunikere med MS SQL fra .NET, hvor man kan kaldes stored procedures, der udfører en række handlinger og efterfølgende returnerer resultatet fra alle select statements. Nu sidder jeg så i java og har brug for at gøre det samme. Jeg har en enkelt stored procedure, som jeg kalder. Det denne gør, er: 1. Insert i en tabel 2. Select fra denne tabel Problemet er, når jeg forsøger at læse min select. Jeg udfører kaldet på følgende måde: String query = "EXEC minSP" java.sql.PreparedStatement stmt = con.prepareStatement(query); ResultSet rs = stmt.executeQuery(); Sidste sætning giver følgende exception: "com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set." Hvis jeg udfører min select først i min SP, så virker det, men jeg har brug for at udføre min insert først. Er der nogen, der ved hvordan man løser dette problem? Jeg bruger MS SQL 2005. På forhånd tak.
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
30. august 2008 - 17:55
#1
Du skal bruge CallableStatement !
30. august 2008 - 17:57
#2
kode snippet: CallableStatement cstmt = con.prepareCall("{CALL uspdt(?,?)}"); cstmt.setDate(1, new Date(df.parse("2005-10-01").getTime())); cstmt.setDate(2, new Date(df.parse("2005-10-31").getTime())); cstmt.execute(); ResultSet rs = cstmt.getResultSet();
30. august 2008 - 18:20
#3
Kan først nå at teste det imorgen, men tusind tak for det hurtige svar. Var bange for, at det ikke kunne lade sig gøre i java :)
30. august 2008 - 18:23
#4
Et lidt mere komplekst eksempel med multiple result set, return value og out parameter: CallableStatement cstmt = con.prepareCall("{? = CALL TEST_MULTIOUT(?,?)}"); cstmt.registerOutParameter(1, Types.INTEGER); cstmt.setInt(2, 5); cstmt.registerOutParameter(3, Types.INTEGER); cstmt.execute(); while(cstmt.getMoreResults()) { ResultSet rs = cstmt.getResultSet(); while(rs.next()) { System.out.println(rs.getInt(1) + " " + rs.getString(2)); } } System.out.println("return value = " + cstmt.getInt(1)); System.out.println("out parameter = " + cstmt.getInt(3));
31. august 2008 - 20:36
#5
Jeg har forsøgt at gøre, som du har vist, men følgende virker ikke. Tror ikke jeg er helt med på, hvordan det skal gøres. Min kode: String query = "EXEC loginAsGuest ?, ?"; con = DriverManager.getConnection(connectionUrl); CallableStatement cstmt = con.prepareCall(query); cstmt.setString(1, nickname); cstmt.setString(2, ip); cstmt.execute(); cstmt.getMoreResults() <- returnerer false
02. september 2008 - 13:44
#6
Det skal lige pointeres, at der først udføres en update i min procedure og herefter en select. cstmt.execute() returnerer derfor false. Kan dette mon have noget med problemet med at det ikke virker, at gøre?
02. september 2008 - 14:00
#7
Jeg fandt ud af, at det er nedvendigt at køre: while(cstmt.getUpdateCount() != -1) cstmt.getMoreResults() lige efter kaldet til databasen. Arne læg et svar.
02. september 2008 - 15:07
#8
ok
Kurser inden for grundlæggende programmering