Соединение с базой проходит нормально (там все чисто, поэтому код не привожу), когда делаю выборку — тоже все ок. Локализовал ошибку. Где-то здесть. Где понять не могу
Использую com.microsoft.jdbc
try {
Statement st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String query="SELECT name AS 'имя',description AS 'описание' from simpletable";
ResultSet rs=st.executeQuery(query);
rs.first();
rs.updateString(1,"test");
rs.updateString(2,"description");
rs.updateRow();
}
catch (SQLException ex) {
cat.error(ex.getMessage());
}
На rs.updateRow() выскакивает эксепшн.
[Microsoft][SQLServer 2000 Driver for JDBC]Row update failed
sqlState: HY000
Здравствуйте, fastgrave, Вы писали:
F>Соединение с базой проходит нормально (там все чисто, поэтому код не привожу), когда делаю выборку — тоже все ок. Локализовал ошибку. Где-то здесть. Где понять не могу
F>Использую com.microsoft.jdbc
F>
F>try {
F> Statement st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
F> String query="SELECT name AS 'имя',description AS 'описание' from simpletable";
F> ResultSet rs=st.executeQuery(query);
F> rs.first();
F> rs.updateString(1,"test");
F> rs.updateString(2,"description");
F> rs.updateRow();
F>}
F>catch (SQLException ex) {
F> cat.error(ex.getMessage());
F>}
F>
F>На rs.updateRow() выскакивает эксепшн. F>
F>[Microsoft][SQLServer 2000 Driver for JDBC]Row update failed
F>sqlState: HY000
F>
а "SELECT name AS 'имя',description AS 'описание' from simpletable FOR UPDATE" не пробовал?
L>а "SELECT name AS 'имя',description AS 'описание' from simpletable FOR UPDATE" не пробовал?
Попробовал — не работает, что естественно, потому что там должно происходить создание курсора и т.п.
После того, как я убедился, что это не работает, моя мысль пришла к тому, что ситуация довольно типичная и нааверное дело в том, что я не до конца понимаю механизм работы, и обратился к инфе
там все подробно разъяснено, в частности приведен вот такой код
Connection con = DriverManager.getConnection(
"jdbc:mySubprotocol:mySubName");
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery(
"SELECT * FROM COFFEES");
т.е. до этого момента верно, а дальше судя по всему действовать надо по-другому, что я и буду выяснять сейчас.
В любом случае спасибо, вы меня вывели из какого-то мозгового ступора, когда я на протяжении последних 2х часов искал ошибку, не удосужившись взглянуть на мануалы.
Если кому-то понадобится или найдет в поиске, сообщу как я решил проблему.
1. Дело окзалось в mssql-драйвере, который оказался реализован криво. Более подробно читайте в MSSQL — jdbc драйвер
, там же есть ссылка на правильный драйвер, который поддерживает jdbc-2 полностью и частично (пока) jdbc-3
2. http://jtds.sourceforge.net/faq.html#forwardOnlyResultSet цитирую >The scroll insensitive/updateable combination is not supported by SQL Server, so such a ResultSet is automatically downgraded to scroll insensitive/read-only by the server. Use the scroll sensitive/updateable combination and it should work.