我最近在做一个项目,是关于物业收费的。其中有一段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]
我描述一下问题的场景:我有两个数据库,一个是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]
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货