java.sql.SQLException: [Microsoft] [Диспетчер драйверов ODBC] Неверный индекс дескриптора - PullRequest
6 голосов
/ 15 июня 2011

Я использую следующий код

try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con = DriverManager.getConnection("jdbc:odbc:access");
    String sql = "Select * from table";
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery( sql );
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    for (int i = 1; i <= columns; i++) {
        columnNames.addElement( md.getColumnName(i) );
    }
    while (rs.next()) {
        Vector row = new Vector(columns);
        for (int i = 1; i <= columns; i++){
            row.addElement( rs.getObject(i) );
        }
        data.addElement( row );
    }
    rs.close();
    stmt.close();
}catch(Exception e){
    System.out.println(e);
}

Отображает:

java.sql.SQLException:[Microsoft][ODBC Driver Manager] Invalid descriptor index

Как это вызвано и как я могу решить?

Ответы [ 5 ]

10 голосов
/ 10 июля 2013

У меня была такая же точная ошибка, это из ODBC Express Driver для Delphi.

Решение, которое я нашел:

Поместите свой varchar (max) и или varbinary (max) поля в конце вашего выбранного запроса.(Порядок в определении таблицы не имеет значения).

Это действительно исправило это для нас, подумал поделиться этим с вами, ребята.

10 голосов
/ 15 июня 2011

Я сомневаюсь, что исключение выдается одной из строк в опубликованном коде. У меня есть причины заявить об этом.

Исключение SQLE с сообщением "Invalid descriptor index" обычно получается, когда вы читаете набор результатов неправильно. Существуют различные способы реализации этого сценария:

  • Чтение столбцов из последовательности. Боюсь, некоторые драйверы JDBC потребуют, чтобы вы читали столбцы по порядку, начиная с первого столбца. Так были написаны некоторые драйверы; вы не можете пропустить ни один столбец при чтении результирующего набора результатов, поскольку драйверы фактически читают поток и преобразуют объекты в потоке в объекты типов JDBC.
  • Возможно, вы читаете столбец, чей индекс недопустим или имя столбца которого не соответствует ни одному из возвращенных столбцов в наборе результатов. Простое решение - либо исправить запрос, чтобы он возвращал нужный столбец, либо исправить код, чтобы он не читал отсутствующий столбец.

Если вам нужно решить эту проблему, вам необходимо знать, какое из вышеприведенных условий выполняется в вашем коде, и исправить это соответствующим образом.

6 голосов
/ 12 августа 2015

Я знаю эту ошибку уже много лет, используя драйвер ODBC с PHP.Попробуйте разместить столбцы текста и изображения в конце списка выбора.
Не используйте

select * from t

, но перечисляйте строго

select plain_column1, plain_column2, .... image_column from t

К сожалению, Microsoft не устает от исправленийбаг.Драйвер JDBC работает нормально.

1 голос
/ 15 января 2015

Я получил ошибку

SEVERE: null java.sql.SQLException: [Microsoft] [Собственный клиент SQL Server 10.0] Индекс недопустимого дескриптора

код был

String sqlStr = "select soldItems.payment as aa, Sysuser.name as sname, Books.Name as abookName, soldItems.Qunt as qunt, soldItems.date as soldBooks from Sysuser inner join soldItems on soldItems.CustomerId=Sysuser.id inner join Books on Books.bookId=soldItems.bookId where CustomerId='" + cusId + "' and PaymentDone is NULL";
    System.out.println(sqlStr);
    DbConnection con = new DbConnection();
    con.getConnection();
    ResultSet rs = con.getData(sqlStr);
    while (rs.next()) {
        int i = 0;


        dataArry[i][0] = rs.getString("abookName");
        dataArry[i][1] = rs.getString("qunt");
         dataArry[i][2] = rs.getString("aa");
        dataArry[i][3] = rs.getString("soldBooks");

        i++;
    }

исправление rs.getString должно быть в том же порядке, что и SQL

, поэтому код должен быть

       dataArry[i][2] = rs.getString("aa");
        dataArry[i][0] = rs.getString("abookName");
        dataArry[i][1] = rs.getString("qunt");

        dataArry[i][3] = rs.getString("soldBooks");
1 голос
/ 17 марта 2013

Это произойдет, если вы попытаетесь получить значение переменной набора результатов в значении индекса 0. Например: рассмотрим таблицу, которая имеет 5 столбцов:

ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
while(rs.next())
{
   for(int i=0;i<5;i++)
   //This will throw the exception
   System.out.println(rs.getString(i)); //Since the value will be returned from 1 not 0
   //The below code was the right way
   System.out.println(rs.getString(i+1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...