我最近在做一个项目,是关于物业收费的。其中有一段java代码调用SQL server 2000的存储过程,老是出现错误。但是这个存储通过sql server 2000查询分析器运行都是正确的,没有出错。
  我描述一下问题的场景:我有两个数据库,一个是ecarddb数据库,一个是houseAgency数据库,这两个数据库都是sql server 2000。ecarddb数据库所在的服务器是192.168.1.2;houseAgency数据库所在的服务器是192.168.1.3;两个数据的用户名密码都一样:sa admin123
我现在想做的一件事是不定时的把数据库houseAgency中的一个表数据feeInfo导入到ecarddb中的feeInfo表中去。我于是就想到了通过存储过程来实现这一个功能。
  一。 192.168.1.2 ecarddb
  feeInfo(
  id (integer),----主键,自增
  feeItemName(varchar(30)),-----费用名称
  feeMonth(varchar(30)),----费用总额
  re(varchar(30))-------备注
  )
  二。 192.168.1.3 houseAgency
  feeInfo(
  id (integer),----主键,自增
  feeItemName(varchar(30)),-----费用名称
  feeMonth(varchar(30)),----费用总额
  re(varchar(30))-------备注
  )
  
  在houseAgency数据库中新建一个存储过程:
  CREATE PROCEDURE insertData
  as  
  declare @feeItemName varchar(30)
  declare @feeMonth varchar(30)
  declare @re varchar(30)
  if not exists(select 1 from master.dbo.sysservers where srvname = 'myConn')
  begin
  exec master.dbo.sp_addlinkedserver 'myConn', ' ', 'SQLOLEDB', '192.168.1.2'  
  exec master.dbo.sp_addlinkedsrvlogin 'myConn', 'false',null, 'sa', 'admin123'
  end
  else
  begin
  exec master.dbo.sp_dropserver 'myConn', 'droplogins'
  exec master.dbo.sp_addlinkedserver 'myConn', ' ', 'SQLOLEDB', '192.168.1.2'  
  exec master.dbo.sp_addlinkedsrvlogin 'myConn', 'false',null, 'sa', 'admin123'
  end
  
  declare feeInfo_cursor cursor for select feeItemName,feeMonth,re from feeInfo
  open feeInfo_cursor
  fetch next from feeInfo_cursor into @feeItemName,@feeMonth,@re
  while(@@fetch_status=0)
  begin
  exec('insert into myConn.ecarddb.dbo.feeInfo(feeItemName,feeMonth,re) values('''+@feeItemName+''','''+@feeMonth+''','''+@re+''')')
  fetch next from feeInfo_cursor into @feeItemName,@feeMonth,@re
  end
  close feeInfo_cursor
  DEALLOCATE feeInfo_cursor
  exec master.dbo.sp_dropserver 'myConn', 'droplogins'
 
三。在java程序中这样调用存储过程
  import java.sql.CallableStatement;
  .......
  ......
  CallableStatement cstmt = null;
  String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
  String sql = "{call insertData()}";
  String driverUrl="jdbc:microsoft:sqlserver://192.168.1.3:1433;DatabaseName=houseAgency;user=sa;password=admin123";
try {
  Class.forName(driver);
  try {
  con = DriverManager.getConnection(driverUrl);
  cstmt = con.prepareCall(sql);
  cstmt.execute();
  } catch (SQLException e) {
  }
  } catch (ClassNotFoundException e) {
  }
  
 
 
四。通过上面调用后,出现错误,大致意思是
 
com.microsoft.sqlserver.jdbc.SQLServerException: 不能在事务内部执行过程 'sp_addlinkedserver'
  
 
 
这个问题困扰我一段时间,因为两个数据库的数据需要不定时相连。请问如何通过java调用含有sp_addlinkedserver的存储过程,该怎么样调用才能成功?期待大家能帮我解决这个问题!致谢!  我的QQ:108004843
  email:[email protected]

解决方案 »

  1.   

    你的存储过程运行能满足你的需求吗?CallableStatement执行那块应该没问题
      

  2.   

    谢谢楼上的解答~我的存储过程能满足我的需要现在我已经解决这个问题了,我用的框架是IBATIS+Spring,框架中写的业务方法名如果后缀带有"Transaction",框架会自动提交业务这个是在applicationContext.xml文件中配置的后来我把在业务中写的方法名字中去掉"Transaction",然后再在方法里面调用这个存储过程,OK,没有报错!
      

  3.   

    我也遇到同样的问题,但是我是在ibatis的实体文件中进行调用的,不知道怎样控制事务的提交,加了你的QQ,希望帮助解决,感激不尽