Avatar billede stephanryer Nybegynder
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.
Avatar billede arne_v Ekspert
30. august 2008 - 17:55 #1
Du skal bruge CallableStatement !
Avatar billede arne_v Ekspert
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();
Avatar billede stephanryer Nybegynder
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 :)
Avatar billede arne_v Ekspert
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));
Avatar billede stephanryer Nybegynder
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
Avatar billede stephanryer Nybegynder
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?
Avatar billede stephanryer Nybegynder
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.
Avatar billede arne_v Ekspert
02. september 2008 - 15:07 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester