Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决CallableStatement问题?_Java_Sql Server_Jdbc Odbc - Fatal编程技术网

Java 如何解决CallableStatement问题?

Java 如何解决CallableStatement问题?,java,sql-server,jdbc-odbc,Java,Sql Server,Jdbc Odbc,我正在使用eclipse与MS SQL Server链接以完成一项任务,但我面临一些问题。每当我编写代码从数据库的任何表中读取数据时,它都会正确显示所有数据,这意味着连接良好,但当我执行存储过程时,我面临两个问题1。)每当我排除调用execute()的callableStatement变量时方法没有数据发送到数据库2。)每当我包含调用execute()方法的可调用变量时,我都会收到一个错误,指出[Microsoft][ODBC SQL Server Driver]参数类型无效。你能帮我理解发生了

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

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
alter程序addcustomer
(
@Trn int,
@LName varchar(30岁),
@FName varchar(30岁),
@MName varchar(30岁),
@MStatus varchar(20),
@Dob日期,
@电邮varchar(100),
@Telphone varchar(20),
@永久地址varchar(300),
@邮寄地址:varchar(300),
@发动机数量varchar(25),
@emp_id int,
@购买日期,
@帕托·瓦尔查尔(300)
)
作为
开始
开始训练
插入客户
值(@Trn、@LName、@FName、@MName、@MStatus、@Dob、@Email、@Telphone、@Permanent\u addr、@mailing\u addr、@PartO)
exec addPurchase@Trn、@engine\u num、@emp\u id、@date\u of\u purchase
如果(@@0错误)
开始
选择“发生意外错误”
回滚事务
返回1
结束
提交事务
结束
  • 您必须注册输出参数。JDBC要求在语句执行之前使用各种
    registerOutputParameter()
    方法指定它们
  • 第一个?是程序的结果
  • 试试这个(我假设
    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();