2014-05-13 2 views
0

제발 SQL Server에서 java jdbc의 매개 변수화 된 저장 프로 시저를 호출하는 데 도움이 필요합니다. 그것에게 예외를 던지는이 방법을 수행 한 후jdbc에서 매개 변수화 된 저장 프로 시저를 호출하는 방법

try{ 
    String str = "{call patientreg(?)}"; 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    con = DriverManager.getConnection("jdbcdbc:GeneralHospital"); 
    cstmt = con.prepareCall(str); 
    cstmt.setInt(1, Integer.parseInt(t.getText())); 
    cstmt.execute(); 

    int pid = cstmt.getInt(1); 
    String sname = cstmt.getString(2); 
    String fname = cstmt.getString(3); 
    String mname = cstmt.getString(4); 
    String regdate = cstmt.getString(5); 
    String dob = cstmt.getString(6); 
    String sex = cstmt.getString(7); 
    String phonenum = cstmt.getString(8); 
    String address = cstmt.getString(9); 
    String email = cstmt.getString(10); 
    int age = cstmt.getInt(11); 

    l1.setText(sname+""+ fname+""+mname); 
    l3.setText(Integer.toString(pid)); 
    l4.setText(regdate); 
    l5.setText(dob); 
    l6.setText(Integer.toString(age)); 
    l7.setText(sex); 
    l8.setText(phonenum); 
    l9.setText(address); 
    l10.setText(email); 
    cstmt.close(); 
} 
catch(Exception ex) 
{ 
    System.out.println("Error occured"); 
    System.out.println("Error:"+ex); 
} 

: 저장 프로 시저는

create proc patientreg 
@id int 
    as 
begin 
    select [patient_id],[Psurname], [pFirstname], [pMiddlename], [reg_date], [DOB], [Sex], [Phone_num], [Addr],[Email],[dbo].[fncomputeage](DOB) from [dbo].[Patient_registration] where [patient_id] = @id 
end 

dbo.fncompute(DOB) 함수 JDBC에 전화를

입니다 유의하시기 바랍니다 SQL에서 다음과 같이 간다 Error:java.sql.SQLException: Parameter 1 is not an OUTPUT parameter

+0

그냥 말 : 당신은 내가 미안해야하고 일부 순수 자바 대안 드라이버 –

답변

-1

시도해보십시오.

ResultSet rs = null; 
PreparedStatement cs=null; 
Connection conn=getJNDIConnection(); 
try { 
cs=conn.prepareStatement("exec sp_name ?,?"); 
cs.setString(1, "val1"); 
cs.setString(2, "val2"); 
rs = cs.executeQuery(); 
ArrayList<YourClass> listYourClass = new ArrayList<YourClass>(); 
while (rs.next()) { 
    YourClassret= new YourClass(); 
    ret.set1(rs.getString(1)); 
    ret.set2(rs.getString(2)); 
    ret.set3(rs.getString(3)); 
    listaObjectX.add(ret); 

} 
return listYourClass ; 
} catch (SQLException se) { 
    System.out.println("Error "+ se.getMessage()); 
    se.printStackTrace(); 

} finally { 

    try { 

     rs.close(); 
     cs.close(); 
     con.close(); 

    } catch (SQLException ex) { 
     //do ex.print 
    } 
} 
+0

를 찾을 필요가 있으므로, 이후 자바 버전 8, 때문에, JDBC-ODBC 브릿지는 JDK에서 제거되었는지 조심 SQL 서버 스토어드 프로 시저라고 부르지는 않았지만 CallableStatement를 사용하여이 작업을 수행하지 않아야합니까? –

+0

예, 저장 프로 시저를 호출 할 때는 CallableStatement를 사용해야합니다. 스토어드 프로 시저의 리턴 값이나 출력 매개 변수를 검색 할 필요가없는 한, 위 코드는 작동합니다. – aaberg

0

코드에 몇 가지 문제점이 있습니다.

먼저 jdbc odbc 드라이버를 사용하지 마십시오! 그것은 불안정하고 올바로 작동하지 않을 수 있습니다. Microsoft의 own jdbc driver을 사용하거나 더 나아가서는 jTDS을 사용하십시오. 이것은 Sql Server의 우수한 오픈 소스 jdbc 드라이버입니다.

두 번째로 의 getInt, getString 등 메소드는 저장 프로 시저에서 출력 매개 변수를 검색하는 데 사용됩니다. 당신이 가지고있는 것은 평범한 결과입니다.

CallableStatement cstmt = con.prepareCall("{call patientreg(?)}"); 

// add input parameter 
cstmt.setInt(1, someInteger); 

// execute and get resultset. 
ResultSet rs = cstmt.executeQuery(); 

// read resultset 
while (rs.next()) { 
    int pid = rs.getInt(1); 
    String sname = rs.getString(2); 
    String fname = rs.getString(3); 
    // etc. 
} 

// remember to close statement and connection 
관련 문제