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