Ошибка Jdbcrowset? возвращает исключение nullpointer!

#java #sql-server #jdbc

#java #sql-сервер #jdbc

Вопрос:

 package CrimeFile;

import com.sun.rowset.JdbcRowSetImpl;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.rowset.JdbcRowSet;

/**
 *
 * @author singgum3b
 */
public class test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // TODO code application logic here
                    JdbcRowSet jrsi=new JdbcRowSetImpl();
                    jrsi.setUrl("jdbc:sqlserver://localhost:1433;databaseName=CrimeFile");                    
                    jrsi.setUsername("sa");
                    jrsi.setPassword("hellokitty");
                    jrsi.setCommand("select * from dbo.Target");
                    jrsi.execute();
        }              
        catch (SQLException ex) {            
            Logger.getLogger(test.class.getName()).log(Level.ALL, null, ex);
        } 
    }
}
  

Исключение:

 Exception in thread "main" java.lang.NullPointerException
    at com.sun.rowset.JdbcRowSetImpl.prepare(JdbcRowSetImpl.java:666)
    at com.sun.rowset.JdbcRowSetImpl.execute(JdbcRowSetImpl.java:553)
    at CrimeFile.test.main(test.java:30)
Java Result: 1
  

(строка 30 — это crsi.excute();)

Я использую sql server 2008 и ms jdbc 3.0. Я погуглил и обнаружил, что этот код такой же, как в примере Sun по ссылке.Я ошибаюсь?

Комментарии:

1. вы пробовали другую, очень простую таблицу? Потому что, хотя у меня нет MS SQL, я попробовал практически тот же код с драйвером MySQL, и никаких проблем. Кроме того, какую JRE вы используете?

2. я попробовал это на тестовой таблице всего с 1 столбцом, но, похоже, никакой разницы. Я использую jre 6. Более того, похоже, что это проблема с драйвером jdbc, поскольку здесь ссылка

3. Можно ли попробовать драйвер jTDS с открытым исходным кодом?

4. большое спасибо! это явно ошибка MS JDBC, я переключился на драйвер jTDS, и все происходит быстро. Пожалуйста, ответьте, поскольку я не могу опубликовать ответ самостоятельно.

Ответ №1:

У меня была такая же проблема, и я пришел к выводу, что проблема заключается в том, что драйвер Microsoft не поддерживает комбинацию, conn.prepareStatemen(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); как указано на веб-сайте Microsoft, что приводит к исключению метода prepare(). Я взял исходный код из here, создал свой собственный MyJdbcRowSetImpl и изменил параметр prepareStatement на ResultSet.TYPE_SCROLL_SENSITIVE

Драйвер Jtds не был решением, поскольку он не поддерживает наборы строк.

Ответ №2:

Хорошо, ответом было переключение на драйвер jTDS, который можно найти здесь

В драйвере MS JDBC явно что-то перепутано.

Ответ №3:

Я помню, что это исключение NullPointerException происходило со мной, но только если я вызываю execute (), когда я не должен этого делать, т. е. при использовании JdbcRowSetImpl с результирующим набором в качестве аргумента

 private JdbcRowSet executeWithResultSet(Connection conn, String sqlQuery)
        throws SQLException {
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sqlQuery);
    JdbcRowSet jdbcRs = new JdbcRowSetImpl(rs);
    jdbcRs.execute(); //<-- results to the error as reported

    return jdbcRs;
}