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