开发者

SQLServerException Invalid column name

I have a problem that doesn't appear always, but it do it most of the times. In my huge java forecast class I have some ResultSets, and when I execute the routine I get:

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) 

The column exists, so I don't know what is the problem...

The code line is this one:

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

The same problem appears on other columns but it usually crash here.

Thank you!

Edit: ok, this is the whole method:

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 = MSSQLS开发者_StackOverflow中文版erverAccess.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();
}

And the statement, maybe i'm doing something wrong?:

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;
    }
}

Thanks guys :) Could be something wrong with the statement?


remember that Java is case-sensitive and so can be your table on SQL depending on the way you created them, actually depending on the collation on your DB. If your database is created with a Case Sensitive collation then all object names will be Case Sensitive.

try to check the exact columns name of the column on SQL and access it using [] and the exact case

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜