# java.sql.SQLException: Ungültiger Spaltenindex



## fenerli23 (16. Januar 2008)

Hi,

habe ein Programm geschrieben, in dem ich eine Select- Anweisung habe und in dieser ich ein Parameter setze. Nur habe ich jetzt ein problem da ich eine Fehlermeldung angezeigt bekomme, aber meiner Meinung nach müsste alles so stimmen..?

habe dies so realisiert: //ersetzt diese Zeichen "?" in der Select- Anweisung

```
pstmt.setString(1, parameter);
```

nun kriege ich aber diese Fehlermeldung:

```
java.sql.SQLException: Ungültiger Spaltenindex
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
	at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5265)
	at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:5257)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:132)
	at meinpackage.Service.Webservice(Service.java:332)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
	at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:98)
	at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
	at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:96)
	at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:145)
	at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
	at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:120)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:595)
```


----------



## mk666 (16. Januar 2008)

Ein wenig mehr Quellcode wäre schon nett. So kann man nicht viel sagen.


----------



## fenerli23 (16. Januar 2008)

```
try {
			ApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] {"meinpackage/applicationContext.xml"});
			SqlStatements statm = (SqlStatements)appCtx.getBean(statement);
			statement = statm.getStatement();
			Context initContext = new InitialContext();
	    	Context envContext  = (Context)initContext.lookup("java:/comp/env");
	    	DataSource ds = (DataSource)envContext.lookup("jdbc/xe");
	    	
	    	System.out.println(statement);
	    	
	        if (ds != null) {
		      conn = ds.getConnection();
		      pstmt = conn.prepareStatement(statement);
			  pstmt.setString(1, parameter);
....
```

habe das System.out.println zum test hier damit ich nachschauen kann, ob das Statement entnommen werden kann von der xml Datei ... Und die Antowrt darauf lautet: Ja das richtige statement wird ausgegeben bzw. rausgelesen, aber beim setzen entsteht dieser Fehler denn ich oben dargestellt habe...

Danke


----------



## Oliver Gierke (16. Januar 2008)

Abgesehen davon, dass der Code ziemlich grausam ist - was sagt dir denn die Wortgruppe "Ungültiger Spaltenindex"? Hmmm, da ist von einem Index die Rede. Wo benutzt du denn einen index? Ach ja, beim setzen der Statementparameter.

Scheinbar schießt also deine 1 ins Leere. Hat dein Query vielleicht nur einen Parameter? 1 setzt den 2. Parameter (soweit ich weiß beginnen die auch bei 0 zu zählen...).

Btw. darf ich fragen, was du da codest? Sieht mir nach ner recht schlimmen Selbstimplementierung von NamedQuerys aus. Warum dann nicht JPA http://docs.solarmetric.com/full/html/ejb3_overview_query.html#ejb3_overview_query_named ?

REINHAUN!


----------



## fenerli23 (16. Januar 2008)

nee ich setzte hier 2 Parameter und meines Wissens nach ist die 1 für den ersten Parameter somit und für den zweiten Parameter der Index 2....
habe auch das ganze mit 0 für den ersten Parameter und 1 für den 2 Parameter versucht klappt auch nicht... ;(


----------



## Oliver Gierke (16. Januar 2008)

wie sieht der query genau aus? du musst die Platzhalter mit "?1, ?2" versehen, soweit ich weiß oder halt benamte platzhalter ":foobar" verwenden.

Gruß
Ollie


----------



## fenerli23 (16. Januar 2008)

mmh nee ich habe das nur so implementiert "?" für beide Parameter..., da ich das auch so kennengelernt habe.

mmh das mit dem Namen ist auch eine Überlegung wert, da muss ich das ganze aber mit Statement anstatt PreparedStatement realisieren ..?


----------



## Oliver Gierke (16. Januar 2008)

Okay, reine JDBC Prepared Statements werden wohl so befüllt. Kannst du mal das komplette Statement posten?


----------



## fenerli23 (16. Januar 2008)

Oliver Gierke hat gesagt.:


> Okay, reine JDBC Prepared Statements werden wohl so befüllt. Kannst du mal das komplette Statement posten?



meinst du die Sql Anweisung..?


----------

