вторник, 25 мая 2010 г.

Java и Хронимые процедуры MS SQL Server

По необходимости пришлось связать свою судьбу с Java =)
Если чесно пока об этом не желею. При решении задачь исмользую сервер баз данных на MS SQL 2005. Драйвера доступа (JDBC) скачал с офф. сайта www.microsoft.com

В данном посте расматривается задача об использовании в Java хронимых процедур из SQL Server.
При написании данного класса у меня возникла проблема. Хронимая процедура выполняет разузловку изделия и выводит таблицу вхождения материалов в изделие (Он приводился в более ранних постах). Процедура иполнена в стиле CURSORO-в в связи с этим возникли затруднения при решении задачи.


import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;

public class connectDS {

public static void main(String[] args) {

// Declare the JDBC objects.
Connection con = null;
CallableStatement cstmt = null;
ResultSet rs = null;

try {
// Establish the connection.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setUser("sa");
ds.setPassword("MyPass");
ds.setServerName("127.0.0.1");
ds.setPortNumber(1433);
ds.setDatabaseName("pubs");
con = ds.getConnection();

// Execute a stored procedure that returns some data.
cstmt = con.prepareCall("{call dbo.RET_ShowStructItem1(?)}");
cstmt.setString(1, "3.020.324.007-001");
cstmt.execute();

while (!cstmt.getMoreResults() && (cstmt.getUpdateCount() != -1)) {
}

rs = cstmt.getResultSet();


while (rs.next()) {
System.out.println(rs.getString("item"));
System.out.println(rs.getString("description"));
System.out.println();
}
} // Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
}
}
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e) {
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
}
}
System.exit(1);
}
}
}


Данный код приведенный выше работает и уже модефицированн.
Проблема заключается в том что процедура в момент обработки при каждом выполнении (INSERT, UPDATE, SELECT) возвращает результат выполнения это можно отключить в процедуре командой SET NOCOUNT ON либо при написании класса использовать цикл

while (!cstmt.getMoreResults() && (cstmt.getUpdateCount() != -1)) {}


Для коректности лудше вставить туда обработчики исключений.

P.S.:Пример от Microsoft

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

Отправить комментарий