Meddelande

Minska
No announcement yet.

JAVA-DB-PROBLEM:

Minska
X
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • JAVA-DB-PROBLEM:

    Hej!

    Har klurat ett tag i vilken forumdel detta skall läggas... Kom fram till att här troligtvis är bäst...

    Jag har i min java applikation en SQL-fråga som skall lägga till en rad i databasen...
    Kod:
    String query = "INSERT INTO WO_TASK_STATUS(WOT_AUTO_KEY, WOS_AUTO_KEY, SYSUR_AUTO_KEY) VALUES ("+jobCard+",4,"+user+")";
    try{
           PreparedStatement ps2 = connection.prepareStatement(query);
           ps2.executeQuery();
            }catch (SQLException ex){
           System.out.println("Något blir fel i insertStatus: "+ex.getMessage());
    Detta genererar
    ett felmeddelande:
    Kod:
    Något blir fel i insertStatus: ORA-01403: no data found
    ORA-01403: no data found
    ORA-01403: no data found
    Anledningen att jag placerade tråden här, är att när jag kör sql frågan i min sqleditor, då fungerar den, det är bara när jag kör genom java-programmet det strular...
    Vad kan detta bero på?!

  • #2
    Prova att använda executeNonQuery() istället för executeQuery().

    mvh
    @aviddevguy

    Kommentera


    • #3
      Den metoden lyckas jag inte få att fungera överhuvudtaget,
      Hur används den? (har du lust att försöka skriva om mitt exempel med den istället? bara göra ps2.executeNonQuery(); fungerade inte alls...
      (Testade även med ExecuteNonQuery();

      Kommentera


      • #4
        Nej, jag kan ingenting om java - egentligen. Jag tycker det verkar som att felmeddelandet betyder att det inte fanns något data att hämta - dvs att executeQuery förväntar sig ett resultat av något slag, vilket man ju inte får av en insert. Jag googlade lite, eftersom jag inte hade något bättre för mig, och tyckte nog att man kunde skriva så i sammanhanget.

        Jag är ledsen om jag ledde dig in på fel spår - men det verkar gå att hitta ganska mycket på Google med ledning av felmeddelandet och nyckelordet insert.

        Lycka till!
        @aviddevguy

        Kommentera


        • #5
          Jag har spenderat några timmar med googlande nu... helt utan lycka... det här är väldigt märkligt... och väldigt störande:-p

          Kommentera


          • #6
            Några frågor och funderingar:

            Vad händer om du skriver ut din Query innan du försöker köra den mot DB:n? Alltså:
            [kod]String query = "INSERT INTO WO_TASK_STATUS(WOT_AUTO_KEY, WOS_AUTO_KEY, SYSUR_AUTO_KEY) VALUES ("+jobCard+",4,"+user+")";
            System.println(query);
            [/kod]
            Får du ut det du tror? Det är inte så att jobCard eller user är tomma, lika med NULL eller något annat "kul" som gör att du skickar en annan fråga till databasen än du tror?

            Prepared statement för resten... ? Har inte de en annan syntax? Det är några år sedan jag anslöt till en DB med Java så mycket kan ha hänt (både med mitt minne och med språket) men anger man inte en Prepared Statement som något i stil med:
            [kod]String query = "INSERT INTO WO_TASK_STATUS(WOT_AUTO_KEY, WOS_AUTO_KEY, SYSUR_AUTO_KEY) VALUES ("?",4,"?")";
            PreparedStatement ps2 = connection.prepareStatement(query);
            // Och sedan sätter ?:n i separata satser efter? Något i stil med:
            ps2.setInt(1, jobcard);
            ps2.setInt(2, user);
            ps2.executeUpdate(); // <---- Borde vara en annan typ av anrop på slutet också
            [/kod]executeQuery förväntar sig nog ett resultatset tillbaka, medan executeUpdate (ev) förväntar sig antalet påverkade rader vilket är en viss skillnad.

            Prepared Statement exmpel Java (från Google)
            Last edited by aasah; 2012-11-19, 08:59. Anledning: Sett typen av värden i svaret nedan.

            Kommentera


            • #7
              Jag tänkte samma tanke, att query blir konstig...
              Men dessvärre...
              kör jag en system.out.println(query); får jag:

              INSERT INTO WO_TASK_STATUS(WOT_AUTO_KEY, WOS_AUTO_KEY, SYSUR_AUTO_KEY) VALUES (116845,4,1041)

              Och som sagt, kopierar jag ut den där queryn och kör den i SQL-Developer fungerar det utmärkt...

              Kommentera


              • #8
                Du läste visst bara halva mitt svar?

                Vanligen finns det två sätt att ställa frågor mot databasen. En för SELECT-satser där man förväntar sig ett svar tillbaka på noll eller flera rader, med minst en kolumn av värden. Och en annan för INSERT, UPDATE, DELETE som bara opererar inuti tabellen och ev. skickar tillbaka antalet rader som påverkats.

                Jag tror att ett bekymmer är att du använder fel sort. Servern förväntar sig ett resultatset efter executeQuery. Byt mot executeUpdate och ser om det går bättre!

                Om det inte hjälper, fundera över om problemet beror på att du använder ett PreparedStatement på fel sätt, se mitt svar ovan, andra halvan!
                Last edited by aasah; 2012-11-19, 08:55.

                Kommentera


                • #9
                  Haha jag läste hela ditt svar, kommenterade inte andra halvan bara då jag var tvungen att kolla upp det ;-)
                  Ber om ursäkt för det...
                  Har testat med både executeQuery och executeUpdate med samma resultat, men ska testa med setString om det hjälper, finns det någon anledning att du bara kör jobcard och user som setString och inte den i mitten?

                  Kommentera


                  • #10
                    nigge skrev: Visa inlägg
                    Har testat med både executeQuery och executeUpdate med samma resultat, men ska testa med setString om det hjälper, finns det någon anledning att du bara kör jobcard och user som setString och inte den i mitten?
                    Tja, eftersom det står 4 där så utgick jag ifrån att den alltid ska vara 4 medan de övriga är variabler? Bara därför...

                    Men OBS! att jag uppdaterade svaret efter att ha sett värdena. Nu står det:
                    ps2.setInt(1, jobcard);
                    ps2.setInt(2, user);

                    Kommentera


                    • #11
                      Dessvärre exakt samma resultat med
                      Kod:
                       String query = "INSERT INTO WO_TASK_STATUS(WOT_AUTO_KEY, WOS_AUTO_KEY, SYSUR_AUTO_KEY) VALUES (?,4,?)"; 
                      
                       int job = Integer.parseInt(jobCard);
                               int us = Integer.parseInt(user);
                            PreparedStatement ps2 = connection.prepareStatement(query);
                             ps2.setInt(1, job);
                               ps2.setInt(2, us);
                               
                               
                             ps2.executeUpdate();

                      Kommentera


                      • #12
                        Hm... jag börjar få slut på idéer, men din välfunna signatur gör ju att man tänker ett extra varv.

                        Vilken typ är det på kolumnerna WOT_AUTO_KEY och SYSUR_AUTO_KEY? Om de inte är definierade som numeriska, ska det vara setString i alla fall. Jag ser ovan att du konverterar värdena till intar.

                        Vilken databas ansluter du mot? MySQL, SQL Server, Oracle...?

                        När du skriver att det fungerar att göra detta från databasen kör du nästan säkert inte frågan med samma användare som applikationen kör som. Dubbelkolla att den användare som applikationen använder får sätta in data i önskad tabell! Enligt tips via Google verkar Oracle kunna slänga ur sig just det felmeddelandet vid rättighetsproblem.
                        Last edited by aasah; 2012-11-19, 16:57.

                        Kommentera


                        • #13
                          Du kör ju ett INSERT-statement, inte en fråga, men anropar executeQuery(), har du läst dokumentationen?

                          http://docs.oracle.com/javase/6/docs...Statement.html

                          "executeQuery: Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query"

                          Du får ju ett fel från Oracle som säger att den inte hittade något data att returnera.

                          Tänk lite, läs dokumentationen för PreparedStatement och anropa sedan rätt metod, det vill säga execute().

                          Edit; nu såg jag att du redan testat att skippa executeQuery men ändå får samma fel. En fråga: har du någon trigger på tabellen som kör en SELECT? Jag vågar sätta min arm på att det är orsaken till ditt fel. En INSERT kan inte ge detta fel.
                          Last edited by sgtpepper; 2012-11-19, 17:40.

                          Kommentera


                          • #14
                            sgtpepper skrev: Visa inlägg
                            Du kör ju ett INSERT-statement, inte en fråga, men anropar executeQuery(), har du läst dokumentationen?

                            http://docs.oracle.com/javase/6/docs...Statement.html

                            "executeQuery: Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query"

                            Du får ju ett fel från Oracle som säger att den inte hittade något data att returnera.

                            Tänk lite, läs dokumentationen för PreparedStatement och anropa sedan rätt metod, det vill säga execute().

                            Edit; nu såg jag att du redan testat att skippa executeQuery men ändå får samma fel. En fråga: har du någon trigger på tabellen som kör en SELECT? Jag vågar sätta min arm på att det är orsaken till ditt fel. En INSERT kan inte ge detta fel.
                            Jag har som du läst testat "alla möjliga" varianter av execute men med samma resultat. Det är mycket möjligt att du får behålla din arm...

                            MEN bör inte samma problem uppstå då när exakt samma query körs i t.ex. SQL-DEVELOPER? samma trigger bör ju startas oavsett vartifrån queryn körs?...eeeeeller?

                            Kommentera


                            • #15
                              nigge skrev: Visa inlägg
                              MEN bör inte samma problem uppstå då när exakt samma query körs i t.ex. SQL-DEVELOPER? samma trigger bör ju startas oavsett vartifrån queryn körs?...eeeeeller?
                              Triggern bör absolut köras på samma sätt oavsett hur du sätter in värden i tabellen (om inte Oracle är väldigt speciell även i det avseendet).

                              Har du kollat att applikationens användare får sätta in värden i tabellen?

                              Kommentera

                              Working...
                              X