如何修复CallableStatement问题?

时间:2015-09-02 16:51:59

标签: java sql-server jdbc-odbc

我正在使用eclipse与MS SQL Server链接来完成一项任务,但是我遇到了一些问题。当我编写代码从数据库中的任何表中读取时,它正确地显示所有数据意味着连接是好的但是当我执行存储过程时我面临两个问题1.)每当我排除一个callableStatement变量时调用execute()方法没有数据发送到数据库2.)每当我包含调用execute()方法的可调用变量时,我得到一个错误,指出[Microsoft] [ODBC SQL Server驱动程序]无效的参数类型。你能帮我理解发生了什么吗

void insertCustomer(int trn, String Ln,String fn,String mn,String dob,String email,String ms,String tel,String pa,String ma,String en,String dp,int emp)
    {
        // Declare the JDBC object.
        Connection con = null;

        try
        {
            // Establish the connection.
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
          con=DriverManager.getConnection("jdbc:odbc:dbase");
          con.setAutoCommit(false);

          CallableStatement sp = con.prepareCall("{? = call               addcustomer(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
          sp.setInt(1,trn);
          sp.setString(2,Ln);
          sp.setString(3,fn);
          sp.setString(4,mn);
          sp.setString(5,ms);
          sp.setString(6,dob);
          sp.setString(7,email);
          sp.setString(8,tel);
          sp.setString(9,pa);
          sp.setString(10,ma);
          sp.setString(11,en);
          sp.setInt(12,emp);
          sp.setString(13,dp);
          sp.execute();//this is where the problem is 
          sp.close();

        }//end of try

        catch(Exception E)
        {
         E.printStackTrace();

        }//end of catch

    }//end of insert customer

这是存储过程的代码

alter procedure addcustomer
    (
        @Trn                 int,
        @LName               varchar(30),
        @FName               varchar(30),
        @MName               varchar(30),
        @MStatus             varchar(20),
        @Dob                 date,
        @Email               varchar(100),
        @Telphone            varchar(20) ,
        @Permanent_addr      varchar(300),
        @mailing_addr        varchar(300), 
        @engine_num          varchar(25),
        @emp_id              int,
        @date_of_purchase    date,
        @PartO               varchar(300)

    )
    AS
    BEGIN

         Begin tran
             INSERT INTO customer 
             VALUES(@Trn, @LName,@FName,@MName,@MStatus, @Dob,@Email,@Telphone,@Permanent_addr, @mailing_addr,@PartO)

             exec addPurchase @Trn,@engine_num,@emp_id,@date_of_purchase

             IF(@@ERROR <>0)
                BEGIN
                   SELECT'An Unexpected error has occur'
                   ROLLBACK TRANSACTION
                   RETURN 1
                END

             COMMIT TRANSACTION

    END

1 个答案:

答案 0 :(得分:0)

  1. 您必须注册输出参数。 JDBC要求在使用各种registerOutputParameter()方法执行语句之前指定它们。
  2. 第一个?是程序的结果。
  3. 试试这个(我假设VARCHAR是输出参数的类型):

                  CallableStatement sp = con.prepareCall("{? =  call   addcustomer(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
                  sp.registerOutParameter(1,Types.VARCHAR); 
                  sp.setInt(2,trn);
                  sp.setString(3,Ln);
                  sp.setString(4,fn);
                  sp.setString(5,mn);
                  sp.setString(6,ms);
                  sp.setString(7,dob);
                  sp.setString(8,email);
                  sp.setString(9,tel);
                  sp.setString(10,pa);
                  sp.setString(11,ma);
                  sp.setString(12,en);
                  sp.setInt(13,emp);
                  sp.setString(14,dp);
                  sp.execute();