【TO ALL】pb8中执行存储过程将远程表插入到本地表报异类查询错误

liubocy 2011-01-22 08:11:29
存储过程的主要功能是把远程表数据插入到本地表中,在查询分析器中执行成功,pb8调用报下面的错误:
异类查询要求为连接设置Ansi_nulls和Ansi_warnings选项。这将确保一致的查询语句。请启用这些选项,然后重新发出查询


存储过程:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_UpDown]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[P_UpDown]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
SET ANSI_WARNINGS ON
GO

CREATE PROC P_UpDown
AS

Insert test(aa,bb) Select aa,bb From Zd.test.dbo.test

RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET ANSI_WARNINGS ON
GO


pb调用代码:

DECLARE P1 PROCEDURE FOR P_UpDown;
EXECUTE P1;
IF sqlca.sqlcode = -1 THEN
Messagebox('',sqlca.sqlerrtext)
RollBack;
ELSE
Commit;
messagebox('','OK')
END IF


存储过程中的ZD为创建一个链接的服务器,创建sql:

IF EXISTS (select * from master..sysservers where srvname = 'ZD')
exec sp_dropserver 'ZD', 'droplogins'

exec sp_addlinkedserver 'ZD', '', 'SQLOLEDB', '192.168.1.85'
exec sp_addlinkedsrvlogin 'ZD', 'false', null, 'sa', ''


pb中用的是sql专用连接:

SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "test"
SQLCA.ServerName = "127.0.0.1"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = false
SQLCA.DBParm = ""


弄了N个小时了,不知道问题出在哪
...全文
232 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wag_enu 2011-01-25
  • 打赏
  • 举报
回复
我刚好有一个现在使用中的方法,不用改表结构,

主要是基于同一台服务器的两个不同库的。因为先用数据管道把数据复制到目标DB , 因此是不是同一台服务器都是一样的。

用数据管道实现,大至思路这样:
1,用数据管道,把源DB 里的表复制到目标DB 的一个中转表,中转表可以不用自增列;
2,在目标DB 里写存储过程,把临时表的数据复制到目标DB 的指定表;目标DB 指定表也有自增列,和源DB 的表结构对应。在过程里复制前加上 SET IDENTITY_INSERT 表名 ON ,完后OFF
3,清空中转表。。。
wag_enu 2011-01-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liubocy 的回复:]
引用 8 楼 wag_enu 的回复:
自增字段可以手动写入处理的吧?


自增字段手动写入处理?
[/Quote]

老大,很久前就看你上两星了,你给我开玩笑吧?

我的意思是:复制前加上 SET IDENTITY_INSERT 表名 ON
liubocy 2011-01-25
  • 打赏
  • 举报
回复
呵呵 没反映过来。
由于设计的时候没考虑到数据同步的问题,而这个标识列又设置成了主键。
源表和目标表都有用户操作,这就会造成数据重复的现象。

在不修改表结构的情况下,没办法用数据管道了

如果是在同一台服务器,基本不会考虑用数据管道,用存储过程或者直接在查询分析器中执行sql比管道更加灵活方便。

xuam 2011-01-24
  • 打赏
  • 举报
回复
顶这个!
[Quote=引用 1 楼 wag_enu 的回复:]
1,采用PB 的数据管道方式复制数据。

2,试一下:在PB 里用dynamic SQL1 执行一下 SET ANSI_NULLS ON 和 SET ANSI_WARNINGS ON 先。
[/Quote]
liubocy 2011-01-24
  • 打赏
  • 举报
回复
咋就不行呢,不过在网上看到很多人都说没弄成功过。这边机器用的是XP sp3系统

这路如果走不通,得考虑修改表结构用数据管道了,这个工作量有点大啊
liubocy 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wag_enu 的回复:]
自增字段可以手动写入处理的吧?
[/Quote]

自增字段手动写入处理?

[Quote=引用 7 楼 glint 的回复:]
试试去掉存储过程中的事务处理,改为try catch测试下
要支持远程事务,需要在远程的WINDOWS服务器上安装并开启分布式事务
[/Quote]

你指的是Distributed Transaction Coordinator这个事务么,两边机器都开启了的。
wag_enu 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liubocy 的回复:]
引用 1 楼 wag_enu 的回复:
1,采用PB 的数据管道方式复制数据。

2,试一下:在PB 里用dynamic SQL1 执行一下 SET ANSI_NULLS ON 和 SET ANSI_WARNINGS ON 先。

运行这2个set后,报服务器'XXX'上的msdtc不可用。XXX就是192.168.1.85这个机器。

两边机器都开启msdtc服务,并在组件服务里开……
[/Quote]

自增字段可以手动写入处理的吧?
glint 2011-01-24
  • 打赏
  • 举报
回复
试试去掉存储过程中的事务处理,改为try catch测试下
要支持远程事务,需要在远程的WINDOWS服务器上安装并开启分布式事务
liubocy 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wag_enu 的回复:]
1,采用PB 的数据管道方式复制数据。

2,试一下:在PB 里用dynamic SQL1 执行一下 SET ANSI_NULLS ON 和 SET ANSI_WARNINGS ON 先。
[/Quote]
运行这2个set后,报服务器'XXX'上的msdtc不可用。XXX就是192.168.1.85这个机器。

两边机器都开启msdtc服务,并在组件服务里开启msdtc的安全设置,又报:该操作未能执行,因为Ole Db提供程序'SqlOleDb'无法启动分布式事务。

按照http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html这个里面的操作也没能成功,郁闷啊

由于表中有自增字段,就没考虑用数据管道。
glint 2011-01-23
  • 打赏
  • 举报
回复
跟你一样的情况,这么解决的:
openwithparm(w_wait1,"正在传输 "+string(ino)+" 号账单到服务器")
sqlca.autocommit=true
execute immediate 'set ansi_nulls on' using sqlca;
execute immediate 'SET ANSI_WARNINGS on' using sqlca;
declare sync procedure for proc_SyncBill @ishopid=:li_shopid,@ino=:ino;
execute sync;
//fetch sync into :ll_rtn;
if sqlca.sqlcode<>0 then
messagebox("错误","同步数据出错"+sqlca.sqlerrtext)
end if
sqlca.autocommit=false
close(w_wait1)

如果使用ODBC连接,ODBC中有这2个属性设置,不用再去执行set XXX
wag_enu 2011-01-22
  • 打赏
  • 举报
回复
1,采用PB 的数据管道方式复制数据。

2,试一下:在PB 里用dynamic SQL1 执行一下 SET ANSI_NULLS ON 和 SET ANSI_WARNINGS ON 先。

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧