order by mit ?

Status
Nicht offen für weitere Antworten.

marvin42

Mitglied
Hi Leute,

ich schreib gerade mein erstes Programm mit Datenbanken und hab diese Anfrage hier abgesetzt:

Code:
PreparedStatement pstmt = connection.prepareStatement(
    			"SELECT * FROM players ORDER BY ? asc");
    			   pstmt.setString(1, argS);

Wenn ich das Fragezeichen durch einen festen Wert ersetzte, funktioniert es ohne Probleme.
Wenn ich argS als Parameter einsetze, krieg ich diese Fehlermeldung:

Code:
Cannot be in ORDER BY clause in statement [SELECT * FROM players ORDER BY ? asc]


Kann mir da jemand weiterhelfen?
 

DP

Top Contributor
sollte gehen. poste mal den code der danach kommt.

und wer wirft die fehlermeldung?!
 

marvin42

Mitglied
Ganze Funktion:

Code:
 public void playersOrderBy(String argS)
    {
    	int count = 0;
        
    	System.out.println("In DAO - playersOrderBy");
    
    	try
        {
    		System.out.println("argS: " + argS);
    			PreparedStatement pstmt = connection.prepareStatement(
    			"SELECT * FROM players ORDER BY positionP asc");          // mit Konstante -> funktioniert
    	//		 ..."SELECT * FROM players ORDER BY ? asc");
       //                    pstmt.setString(1, argS);    -> Fehlermeldung
    			
    	

            ResultSet rs = pstmt.executeQuery();

            while (rs.next())
            {
            	count++;
            	
                Spieler s = new Spieler();
                s.setFirstName(rs.getString("firstName"));
                s.setLastName(rs.getString("lastName"));
                s.setTeamID(rs.getInt("teamID"));
                s.setPositionP(rs.getString("positionP"));
                s.setSpielerID(rs.getInt("spielerID"));
                
                spielerListe.add(s);
                System.out.println("count: " + count);
            }            
            
            System.out.println("count: " + count + " - spielerListe.size(): " + spielerListe.size());
            
            
        }
    	
    	catch (SQLException e)
        {
            System.out.println("pstmt-Catch: " + e);
        }
    	
    	Object[][]argum = new Object[count][5];
    	String[] s = { "firstName", "lastName", "teamID", "position", "spielerID" };
    	
    	try
    	{
	    	for(int a = 0; a < count; a++)
	    	{
	    		argum[a][0] = new String(spielerListe.get(a).getFirstName());
	    		argum[a][1] = new String(spielerListe.get(a).getLastName());
	    		argum[a][2] = new Integer(spielerListe.get(a).getTeamID());
	    		argum[a][3] = new String(spielerListe.get(a).getPositionP());
	    		argum[a][4] = new Integer(spielerListe.get(a).getSpielerID());
	    	}
		
	    	gui.editTable(count, 5, s, argum);
    	}
    	
    	catch(Exception e)
    	{
    		System.out.println("Exception in for-Schleife oder editTable: " + e);
    	}
    }
 

marvin42

Mitglied
Beispiel für einen Aufruf:

Code:
else if(data[s].equals("Position"))
			dao.playersOrderBy(new String("positionP"));

Wie gesagt, wenn ich jetzt positionP statt dem Platzhalter ? einfüge, funktioniert die Abfrage.
 

marvin42

Mitglied
Ist das eine rhetorische Frage?^^

Ich hab mir auch argS ausgeben lassen, also den String, der hier eingesetzt wird. Stimmt auch. Bin also ziemlich ratlos. :?
 

marvin42

Mitglied
[Edit] Könnte es HSQL sein? Ich weiß nicht so genau, wir haben so ein Datenbanktool von der Schule bekommen (HSQL Database Manager/Server).


Es wird immer besser....

PreparedStatement pstmt = connection.prepareStatement(
"SELECT * FROM players WHERE ? like 'Guard'");
pstmt.setString(1, argS);

...bei argS = positionP: 0 Treffer
...dasselbe, nur pstmt.setString auskommentiert und positionP statt dem ?: fünf Treffer.

???:L
 

DP

Top Contributor
keine ahnung. unter mysql funktioniert das problemlos. schmeiss den dreck weg und nimm ne gescheite datenbank wie access :lol:
 

marvin42

Mitglied
Laut Wikipedia:

"HSQL ist eine vollständig in Java programmierte relationale SQL-Datenbank (RDBMS)...."

Das Problem ist, dass ich diese Datenbank von der Schule aus benutzen muss, abgesehen davon muss das doch auch mit dieser dummen Datenbank funktionieren. Hilfe? Irgendwo? Irgendwer? :x
 

DP

Top Contributor
naja, du kannst es so machen:

Code:
Strign order_by = "spalte";
Connection con...;
Statement stmt = con.createStatement();
String sql = "select x from y order by " + order_by + " asc";
ResultSet rs = stmt.executeQuery(sql);
 
S

SlaterB

Gast
mit dem ? kann es nicht funktionieren,
mit ? kannst du nur Werte übergeben, keine Spaltennamen
 
S

SlaterB

Gast
hmm, bei mir gehts nicht, hab noch nie davon gehört,
aber ein Gegenbeweis ist das natürlich nicht ;)

hast du das wirklich ernsthaft getestet?

> Cannot be in ORDER BY clause in statement
bekomme ich allerdings auch nicht,

sondern
SQL order by ? desc
setString "id"
-> order by 'id' desc

SQL where ? = 5
setString "id"
-> where 'id' = 5

was beides recht sinnlos ist,
das zweite ist natürlich ein normaler JDBC-?-Ersetzungsvorgang, der ja oft gebraucht wird,
wie sollte JDBC da unterscheiden ob ein Wert oder ein Spaltenname gemeint ist?

beim Order By kann ich mir das auch nicht vorstellen..
 

DP

Top Contributor
Code:
     PreparedStatement p1 = con.prepareStatement("select * from customers order by ? desc limit 10");
      p1.setString(1, "customers_id");
      ResultSet r1 = p1.executeQuery();

      while(r1.next()){
        System.out.println(r1.getString("customers_id"));
      }

      p1 = con.prepareStatement("select * from customers order by ? asc limit 10");
      p1.setString(1, "customers_id");
      r1 = p1.executeQuery();

      while(r1.next()){
        System.out.println(r1.getString("customers_id"));
      }

Code:
9743226
9743225
9743224
9743223
9743222
9743221
9743220
9743219
9743218
9743217
1
2
4
5
6
13
14
17
18
20
 
S

SlaterB

Gast
wenn es so ist, dann ist es so,
bei Order By wirds schwierig mit einem Gegenbeispiel,


aber bei WHERE kann es doch auch bei dir nicht funktionieren oder?
bei einer Tabelle mit Spalten name1 und name2,
wie sollte das Programm da bei

WHERE name1 = ?
setString(1,"name2")

reagieren?
es macht ja beides Sinn, zum einen die Frage nach dem festen Wert 'name2',
zum anderen der Vergleich der beiden Spalten..
 

DP

Top Contributor
Code:
     PreparedStatement p1 = con.prepareStatement("? ? ? ? ? ? ? ? ? ?");
      p1.setString(1, "select");
      p1.setString(2, "*");
      p1.setString(3, "from");
      p1.setString(4, "tabelle");
      p1.setString(5, "order");
      p1.setString(6, "by");
      p1.setString(7, "spalte");
      p1.setString(8, "desc");
      p1.setString(9, "limit");
      p1.setString(10, "10");

:D ;)
 
S

SlaterB

Gast
ich sehe hier eindeutig einen Verstoß gegen alle PREPARE-Reichtlinien,
gebe mich aber zufrieden :cool:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben