BCB执行MS SQL脚本,遇到子程序就出错

winapp 2003-09-17 05:30:24
用BCB执行MS SQL数据库生成的脚本文件,读一行就去掉注释再加"\r\n"保存到strSQL里面,读到GO就执行。
但是遇到一个问题,我执行到
if ..... GOTO ABC
.......
ABC:
.......
就出错了,但是我把语句拷贝到MS SQL企业管理器里执行就没事;而且我把strSQL里面的语句拷贝到MS SQL企业管理器里,去掉里面的\t \r\n之后也执行也是正确的。
好像是格式错了,请帮我看看,以下是我strSQL里面的内容,当然不是全部代码,我稍稍该了。

:00DB81C0 "\r\n\r\n\r\nCREATE PROCEDURE dbo . pro_A \r\n( \r\n \t@unitid \tchar(10),\r\n@issuccess int= 0 output \r\n) \t\r\n AS\r\n begin transaction\r\n \r\n \tinsert into net_http\r\n \t\t (unit_id )\r\n \tvalues\r\n \t\t (@unitid) \r\n if @@error <> 0 goto ERR_HANDLER\r\n commit transaction\r\nselect @issuccess=@@error\r\nreturn\t@issuccess\r\n\r\nERR_HANDLER:\r\n\trollback tran\t\r\n\tselect @issuccess=@@error\r\n\treturn\t@issuccess"
...全文
48 25 点赞 打赏 收藏 举报
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
winapp 2003-09-25
我自己搞定了,ADOQUERY控件的paramchek属性为false,在写入SQL属性前先Paramters->Clear(),然后就搞定了。
  • 打赏
  • 举报
回复
梦回童年001 2003-09-21
你用SQL自帶的SQL事件查看器來看看到底BCB生成了什麼樣的SQL代碼。

看看是不是要加上QuotedStr這樣的引用。
  • 打赏
  • 举报
回复
runnerrunning 2003-09-19
大概是冒号的问题
  • 打赏
  • 举报
回复
leimin 2003-09-18
BCB的ADO控件的一直不是很好,你到BORLAND的网站去看看有新的FIX么?
  • 打赏
  • 举报
回复
winapp 2003-09-18
求求大家了,谁搞定了再给100分。
  • 打赏
  • 举报
回复
winapp 2003-09-18
我刚才在
try{……}
catch(...)
{
把strSql里面的内容输入到一个文本文件erro.txt中;
}
再把文件打开看,里面的SQL代码要多规范有多规范,我把文本中的代码拷贝到企业管理器中执行,成功执行,没有半点问题!看来是不是BCB的ADO控件的毛病哦?我用的是TADOCommand。
  • 打赏
  • 举报
回复
zhpsam109 2003-09-18
BCB好像不认识goto!
  • 打赏
  • 举报
回复
winapp 2003-09-18
zjcxc说的没错,可是我现在的文本是一行一行组合的,主要是因为脚本里面有很多注释需要过滤掉,基于过滤的效率考虑的。
还有我这些代码就是要添加存储过程,“ERR_HANDLER:……”都是存储过程的内容,所以不能拿出来专门执行, leimin(黄山光明顶)的主意倒是可行,可是SQL里面那么多 "GOTO ERR_HANDLER",好像不好都该吧?
请大家帮我想想是否是格式上有什么问题,比如哪里是否要顶格啊,换行啊,分开啊之类的。
下面是错误提示:
project sdddf .exe raised exception clsaa EOLeException with message 'Parameter object is improperly defined.Inconsistent or imformation was provided'.process stopped.Use step or Run to continue.
  • 打赏
  • 举报
回复
zjcxc 2003-09-18
试试,不要做任何改动.
读取文件内容到变量中,遇到go就执行.

我的程序是这样做的,一直没错.
  • 打赏
  • 举报
回复
tanbi52 2003-09-18
这个我知道啦,因为早几天我也遇到了同样的问题,查了我整整3个小时,是里面有冒号,bcb不知道怎么回事,有冒号在里面,就是不行,放在分析器里就行,你去掉就好了
  • 打赏
  • 举报
回复
zjcxc 2003-09-18
实在不行,调用isql来执行吧.
  • 打赏
  • 举报
回复
winapp 2003-09-18
我用的是BCB6,刚才我把脚本直接拷贝到ADOCOMMAND的COMMAND->TEXT属性里面,可是执行还是报相同的错,但是如果拷贝到企业管理器里面执行就没错了,晕啊!
  • 打赏
  • 举报
回复
runnerrunning 2003-09-18
那你这直接把你的程序发过来给我吧,我给你写好,再发给你
不要戴第三方控件阿

wyb@2hu.com

qq: 14525554
  • 打赏
  • 举报
回复
jishiping 2003-09-18
我实际上从来没有用ADO控件写过程序,这样的话我也不知道了。也许是ADO控件的问题吧。
不知道你用的是哪个版本的BCB?BCB5有一个ADO的补丁,如果是BCB5,需要打ADO的补丁。
  • 打赏
  • 举报
回复
梦回童年001 2003-09-17
UP
  • 打赏
  • 举报
回复
OpenVMS 2003-09-17
把\r \t \n等去掉,把语句写在EXEC ' '里看看
  • 打赏
  • 举报
回复
leimin 2003-09-17
CREATE PROCEDURE dbo . pro_A
……
AS
……
if……Goto ERR_HANDLER/*跳转*/
……
ERR_HANDLER:
/*子程序*/

用GOTO语句做错误处理不好,会造成整个SP的逻辑不清,一般GOTO语句的数量和代码的质量是成反比的!

SP的错误处理应该这样:
CREATE PROCEDURE dbo . pro_A
……
AS
……
DECALRE @RC INT
SELECT @RC=0

if(@RC=0)
BEGIN
SELECT.....
UPDATE...

SELECT @RC=@@ERRRO
IF @RC<>0
BEGIN
SELECT @RC=-5001
RETURN @RC
END
ELSE
....



  • 打赏
  • 举报
回复
pengdali 2003-09-17
master.dbo.xp_cmdshell 'osql -U 用户名 -P 密码 -i c:\***.sql'
  • 打赏
  • 举报
回复
pengdali 2003-09-17
master.dbo.xp_cmdshell 'osql -U 用户名 -P 密码 -i c:\***.sql'
  • 打赏
  • 举报
回复
runnerrunning 2003-09-17
啊,如果只这样,那么你这样处理了
遇到:
ERR_HANDLER
把ERR_HANDLER部分的程序读入到一个String中,然后执行,同时标记以后遇到
goto ERR_HANDLER就执行该String而遇到ERR_HANDLER节就跳过
这样应该是可以
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
数据库及相关技术
创建于2007-08-02

1159

社区成员

C++ Builder 数据库及相关技术
申请成为版主
帖子事件
创建了帖子
2003-09-17 05:30
社区公告
暂无公告