2011-03-01 65 views
1

いつも現れない問題がありますが、ほとんどの場合そのようになります。私の巨大なJavaの予測クラスでは、私はいくつかのResultSetを持っている、と私はルーチンを実行するとき、私は得る:SQLServerException無効な列名

com.microsoft.sqlserver.jdbc.SQLServerException: El nombre de columna DistanciaMision no es vßlido. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(SQLServerResultSet.java:626) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getString(SQLServerResultSet.java:2301) 
    at es.csic.iiia.udt.itim.iInformation.WebData.Forecast.etaMSR(Forecast.java:1109) 
    at es.csic.iiia.udt.itim.iInformation.WebData.Forecast.phase2(Forecast.java:662) 
    at es.csic.iiia.udt.itim.iInformation.WebData.Forecast.setData(Forecast.java:166) 
    at es.csic.iiia.udt.itim.iInformation.WebData.Forecast.main(Forecast.java:81) 
    at es.csic.iiia.udt.itim.iInformation.WebData.Forecast.execute(Forecast.java:71) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:199) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546) 

列が存在しているので、私は問題が何であるかを知らない...

コードを

他の列にも同じ問題が発生しますが、通常はここでクラッシュします。

ありがとうございました!

編集:OK、これは全体の方法です:

private static void etaMSR() throws Exception, SQLException { 
    /** 
    * 
    * Calculem ETAN MSR - Mision - Seguimiento - Restricciones conductor 
    * 
    * 
    **/ 

    System.out 
      .print("Get data from iTIM forecast&forecastAUX DDBB ....... "); 
    myStatement = MSSQLServerAccess.connection(); 

    // Distancia mision, ruta, hora mision anterior, hora 
    rs = getTable("SELECT  dbo.WebForecast.IdConductor, dbo.WebForecast.IdMision, dbo.WebForecast.IdMisionAnterior, dbo.WebForecast.DistanciaMision, " 
      + "      WebForecast_1.HoraIniMis AS himanterior, dbo.WebForecast.HoraFiMis AS hfmactual, WebForecast_1.Ciudad AS CiudadOrigen," 
      + "      dbo.WebForecast.Ciudad AS CiudadDestino, dbo.Distancias.Ruta, dbo.WebForecast.HoraDistancia AS HoraDistancia" 
      + " FROM   dbo.WebForecast AS WebForecast_1 INNER JOIN" 
      + "      dbo.Distancias ON WebForecast_1.Ciudad = dbo.Distancias.Origen RIGHT OUTER JOIN" 
      + "      dbo.WebForecast ON WebForecast_1.IdMision = dbo.WebForecast.IdMisionAnterior AND dbo.Distancias.Destino = dbo.WebForecast.Ciudad" 
      + " WHERE  (dbo.WebForecast.IdConductor <> '') AND (CONVERT(datetime, '" 
      + df.format(fechaDia) 
      + "') <= dbo.WebForecast.HoraFiMis) " 
      + " AND WebForecast_1.HoraIniMis <= CONVERT(datetime, '" 
      + df.format(fechaDia) + "') "); 
    System.out.println("[ok]"); 


    while (rs.next() && (rs.getString("IdConductor") != "") && org.apache.commons.lang.StringUtils.isNumeric(rs.getString("IdConductor"))) { 

     int initialodometer = 0; 
     String start = null; 

     if (rs.getString("HoraDistancia") != null) { 
      start = rs.getString("HoraDistancia"); 
     } 

     if (rs.getString("himanterior") != null) { 
      start = rs.getString("himanterior"); 
     } 

     if (start != null) { 
      ResultSet myrs = null; 
      Timestamp tobjetivo = rs.getTimestamp("himanterior"); 
      long boundtime = 7200000; // 3600000 = 60m = 1h 
      Timestamp tini = (Timestamp) rs.getTimestamp("himanterior") 
        .clone(); 
      Timestamp tfin = (Timestamp) rs.getTimestamp("himanterior") 
        .clone(); 
      tini.setTime(tini.getTime() - boundtime); 
      tfin.setTime(tfin.getTime() + boundtime); 
      int contador = 0; 

      long bestdiff = 0; 

      myStatement = MSSQLServerAccess.connection(); 
      myrs = getTable("SELECT DISTINCT Odometer, DT " 
        + "FROM DriverEvents " 
        + "WHERE (DT BETWEEN CONVERT(datetime, '" 
        + df.format(tini) + "') " + "AND CONVERT(datetime, '" 
        + df.format(tfin) + "')) " + "AND (CardId = '" 
        + Integer.parseInt(rs.getString("IdConductor")) + "')"); 

      int j = 0; 
      while (!myrs.next() && (j < 20)) { 
       // En caso de no encontrar en las 2h antes y despues nada: 
       tini.setTime(tini.getTime() - boundtime); 
       tfin.setTime(tfin.getTime() + boundtime); 

       myrs.close(); 
       myStatement = MSSQLServerAccess.connection(); 
       myrs = getTable("SELECT DISTINCT Odometer, DT " 
         + "FROM DriverEvents " 
         + "WHERE (DT BETWEEN CONVERT(datetime, '" 
         + df.format(tini) + "') " 
         + "AND CONVERT(datetime, '" + df.format(tfin) 
         + "')) " + "AND (CardId = '" 
         + Integer.parseInt(rs.getString("IdConductor")) 
         + "')"); 
       j++; 
      } 

      if (myrs.next()) { 
       initialodometer = myrs.getInt("Odometer"); 
       bestdiff = Math.abs(tobjetivo.getTime() 
         - myrs.getTimestamp("DT").getTime()); 
       contador++; 
       while (myrs.next()) { 
        long pretendiente = Math.abs(tobjetivo.getTime() 
          - myrs.getTimestamp("DT").getTime()); 
        if (pretendiente <= bestdiff) { 
         bestdiff = pretendiente; 
         initialodometer = myrs.getInt("Odometer"); 
        } 
        contador++; 
       } 

      } 
      myrs.close(); 
      } 

     // Get Odometer distance at the moment 

     if (!rs.getString("IdConductor").isEmpty() && !rs.getString("IdConductor").equals("")) { 
      ResultSet myrs = null; 
      int myodometer = 0; 

      myStatement = MSSQLServerAccess.connection(); 
      myrs = getTable("SELECT  MAX(DT) AS DT, MAX(Odometer) AS Odometer" 
        + " FROM   dbo.DriverEvents" 
        + " WHERE  (CardId = '" 
        + Integer.parseInt(rs.getString("IdConductor")) 
        + "') AND (DT > CONVERT(datetime, '" 
        + df.format(fechaDatos) + "')) "); 

      if (myrs.next()) { 
       myodometer = myrs.getInt("Odometer"); 
       if (initialodometer == 0) 
        initialodometer = myodometer; 

       Float distancia_restante = (float) (Integer.parseInt(rs.getString("DistanciaMision")) - (myodometer - initialodometer)); 
       if (distancia_restante < 0) 
        distancia_restante = (float) 0; 

       Timestamp ETAN = null; 
       Calendar cal = Calendar.getInstance(); 

       if (rs.getTimestamp("himanterior") != null && rs.getTimestamp("himanterior").toString() != "") { 

        cal.setTimeInMillis(rs.getTimestamp("himanterior") 
          .getTime()); 

        if (cal.after(Calendar.getInstance())) { 

         cal.setTimeInMillis(rs.getTimestamp("himanterior") 
           .getTime()); 
        } 

        if (cal.before(Calendar.getInstance())) { 
         cal = Calendar.getInstance(); 
        } 
       } else { 
        if (rs.getTimestamp("HoraDistancia") != null) 
         cal.setTimeInMillis(rs 
           .getTimestamp("HoraDistancia").getTime()); 

       } 

       myStatement = MSSQLServerAccess.connection(); 

       rs2 = getTable("SELECT  TOP (100) PERCENT CardId, DT" 
         + " FROM   dbo.DriverEvents" 
         + " GROUP BY CardId, DT" 
         + " HAVING  (CardId = '" 
         + Integer.parseInt(rs.getString("IdConductor")) 
         + "') AND (DT > CONVERT(datetime, '" 
         + df.format(fechaDatos) + "'))"); 

       if (rs2.next()) { 
        ETAN = getETAN(rs, distancia_restante, cal); 
       } else { 

        ETAN = getETA(rs, distancia_restante, cal, 1); 


       Statement myStatement2 = MSSQLServerAccess.connection(); 
       myStatement2.executeUpdate("UPDATE WebForecast " 
         + "SET ETAmsr = '" + df.format(ETAN) 
         + "', KmsDiff = '" + distancia_restante.intValue() 
         + "' " + "WHERE IdMision = '" 
         + rs.getString("IdMision") + "'"); 

      } else { 


      } 
     } 
    } 

    rs.close(); 
} 

、文、たぶん私は何か間違ったことをやっている?:

private static Statement conStatement(Properties properties){ 

    String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // Load the JDBC driver 
    String dbURL = "jdbc:sqlserver://" 
     + properties.getProperty("qualcomm.action.JDBC.MSSQLServerAccess.ddbbserverIP") 
     + ";DatabaseName=" 
     + properties.getProperty("qualcomm.action.JDBC.MSSQLServerAccess.ddbbName") 
     + ";SelectMethod=Cursor;"; // Connect to a server and database 
    String userName = properties.getProperty("qualcomm.action.JDBC.MSSQLServerAccess.userName"); 
    String userPwd = properties.getProperty("qualcomm.action.JDBC.MSSQLServerAccess.userPwd"); 
    Connection dbConn; 

    try { 
     Class.forName(driverName); 

     dbConn = DriverManager.getConnection(dbURL, userName, userPwd); 
     //log.info("Connection Successful!"); 
     Statement myst = dbConn.createStatement(); 

     return myst; 
    } catch (Exception e) { 
     log.error(e); 
     System.out.println(e); 
     return null; 
    } 
} 

と間違って何かのだろう:)みんなありがとうステートメント?

+1

使用してアクセスしてみてください。私にとっては、おそらく列が存在するようですが、特定のクエリによって返されていないようです。 – Toby

+0

あなたは** 1000%**の列のスペルを間違えていないことを確かめていますか?そうでない列のデータベースに間違ったバージョンが接続されている可能性がありますか? –

+0

あなたは列が存在すると言っても、コードはそうではないと言うとき、誰が私たちを信じると思いますか? –

答えて

0

Javaは大文字と小文字が区別されるため、作成した方法に応じて、実際にはデータベースの照合順序に応じてSQL上にテーブルを作成できます。大文字と小文字を区別する照合でデータベースを作成すると、すべてのオブジェクト名が大文字小文字を区別します。

は、SQLの列の正確な列名を確認し、[]と正確なケース私たちは、このコードを駆動するのクエリを参照してくださいする必要があり