public boolean callProcedure3(Vector v){
boolean ret = false;
CallableStatement cstmt = null;
try {
if (this.con == null) {
this.con = DBManager.getCon();
}
String sql = "{call sub_service_3(?)}";
cstmt = this.con.prepareCall(sql);
cstmt.setString(1, (String)v.get(0));
ret = cstmt.execute();
} catch (SQLException e) {
ret = false;
e.printStackTrace();
}
return ret;
}
就这么简单,存储过程独立运行没问题、数据类型也没问题。但在JAVA函数中调用就返回false。已经改成最简单的Insert语句测试了,还是没反应。Vector中也有数据。
请各位帮忙看下。谢谢

解决方案 »

  1.   

    你没有仔细看API,我贴一下
    public boolean execute()
                    throws SQLException
    Returns:
        true if the first result is a ResultSet object; false if the first result is an update count or there is no result看清楚,如果返回的第一个结果是一个结果集,那么为true,如果是更新数量或者没有结果,则返回false你的insert 是不返回结果集的,当然是false了。 update的更新行数也是false;
    如果你调用select的存储过程,返回就是true;
      

  2.   

    存储过程独立运行没问题,可以插入。JAVA中调用就不行。
      

  3.   

    1 你是否commit()
    2 确信你调用的是那个存储过程,比如删掉看看。
    3 你换一个其它的存储过程看看,比如select/ delete
    4 祈祷吧! 
      

  4.   

    改了一下你的代码,补充成一个完整的,测试没有问题呀,不知道楼主啥意思?import java.util.*;
    import java.sql.*;/*
    准备一下
    create table test(
        col1 varchar(20)
    )create procedure sub_service_3
    @v varchar(20)
    as
        insert into test values(@v)
    */
    public class TestPr {
    private Connection conn = null;
    private CallableStatement cstmt = null;
    final String DB_URL = "jdbc:sqlserver://localhost:1433;DatabaseName=test";
    final String DB_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    final String DB_USER = "test";
    final String DB_PASSWORD = "password";

    public TestPr() {
    System.setProperty("jdbc.driver",
    DB_DRIVER);
    System.setProperty("user", DB_USER);
    System.setProperty("password", DB_PASSWORD);
    } public boolean callProcedure() {
    boolean ret = false;
    Vector<String> v = new Vector<String>();
    String[] s = {"a","b","c"};
    for(String tmp:s){
    v.add(tmp);
    }

    try {
    Class.forName(System.getProperty("jdbc.driver")); if (this.conn == null) {
    this.conn = DriverManager.getConnection(DB_URL, System.getProperties());
    }
    String sql = "{call sub_service_3(?)}";
    cstmt = this.conn.prepareCall(sql);
    cstmt.setString(1, v.get(0));
    ret = cstmt.execute(); // 如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false 
    } catch (SQLException e) {
    ret = false;
    e.printStackTrace();
    } catch(ClassNotFoundException e){
    e.printStackTrace();
    } finally{
    try {
    if(cstmt != null){
    cstmt.close();
    conn.close();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    return ret;
    } public static void main(String[] args) {
    System.out.println(new TestPr().callProcedure());
    }
    }