【问题标题】:SQLServerException Invalid column nameSQLServerException 列名无效
【发布时间】:2011-03-01 15:00:48
【问题描述】:

我遇到的问题并不总是出现,但大多数时候都会出现。在我庞大的 java 预测类中,我有一些 ResultSet,当我执行例程时,我得到:

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) 

栏目存在,所以不知道是什么问题……

代码行是这一行:

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

同样的问题出现在其他列,但通常在这里崩溃。

谢谢!

编辑:好的,这就是整个方法:

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

谢谢大家 :) 声明可能有问题吗?

【问题讨论】:

  • 我们需要查看驱动此代码的查询。在我看来,该列可能存在,但特定查询并未返回它。
  • 您是否 1000% 确定您没有拼错该列,或者您可能连接到了一个错误版本的数据库,该数据库还没有该列??
  • 当你说该列存在,但代码说它不存在时,猜猜我们会相信谁?
  • 谢谢大家,我已经把整个方法贴出来了,也许你能看到问题出在哪里...

标签: sql-server


【解决方案1】:

请记住,Java 是区分大小写的,因此您在 SQL 上的表也可能如此,具体取决于您创建它们的方式,实际上取决于您数据库上的排序规则。如果您的数据库是使用区分大小写的排序规则创建的,那么所有对象名称都将区分大小写。

尝试检查 SQL 上列的确切列名并使用 [] 和确切大小写访问它

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2017-09-02
    • 2021-02-20
    • 1970-01-01
    • 2018-07-13
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多