2014-02-21 91 views
0

正如标题所示,我的代码中嵌入了一个看似简单的嵌入式SQL Update语句,该语句挂起了Powerbuilder 12.5。SQL UPDATE语句挂起Powerbuilder

UPDATE COMMENTS SET comment_text = :strNewComment 
WHERE ID = :lngID; 

我已经看了调试代码;所有变量都具有有效值并且执行完全停止在该SQL语句上。

我唯一可能会发生这种情况的理论是,可能存在锁定问题,因为数据窗口中打开的数据是相同的,但我不够PB的专家知道它是否是。

围绕此场景的一点背景信息:数据窗口网格显示注释列表。用户选择评论行,点击“编辑”按钮并点击它的点击事件。模式窗口在文本框中显示注释文本。用户编辑评论文本,点击确定按钮。点击事件继续,运行上面的sql语句,然后使用Retrieve()调用刷新数据窗口。

感谢

+0

你可以手动运行sql数据库吗? –

+0

是的,相同的sql(减去变量)在Interactive SQL中正常运行。 – voon

+0

你在sqlcode中遇到任何错误吗? – Slapout

回答

2

所以我(意外)设法找到是什么导致我的问题。

我已经通过交互式SQL插入了一些测试记录,然后在开发期间试图编辑这些记录。问题是... 鼓卷 ...我忘了承诺手动插入记录!记录将被交互式SQL锁定,直到提交/回滚或(在我的情况下)关闭交互式SQL。每当我遇到这个问题时,我都会侥幸通过这些手动插入的记录。

所以,这里没什么可看的。只是一个SQL Anywhere新手的错误。感谢你的帮助。

6

这不是我将如何实现它...发送更新的案文回调用程序(很多方法可以做到这一点......),然后做一个SetItem()进入电网DW 。从那里,你可以立即调用你的grid dw的Update(),或者等待更多的更新被收集并且一次更新它们。

完全模仿现有数据窗口功能的嵌入式SQL更新是糟糕的设计选择。

+0

谢谢。我能够没有任何错误地使用SetItem。但是,在调用update和commit之后,数据会在网格中直观更新,但不会在数据库中更新。重新检索相同的记录会导致返回的原始数据。 – voon

+0

这可能是在某种程度上与另一个DW在同一窗口上相关?实际上,这个其他DW是窗口上的原始/主DW。评论网格DW是窗口的新增内容。两个DW都在单独的数据库表上工作,所以除了共享相同的sqlca对象外,我无法看到其中一个如何影响另一个。 我注意到,如果我在注释DW上编辑记录,然后更新主DW中的一个字段,注释DW将恢复/刷新回原始数据。这意味着两个DW之间的某种连接... – voon

+1

确保在DataWindow中将列设置为可更新。如果您的应用程序是PFC,则可以使用SQL Spy服务来检查数据库的内容。否则,在DataWindow的SQLPreview事件中放入诸如beep(1)之类的东西,以便可以在那里设置断点。 –

0

我不知道你在用什么数据库,但如果它被占用一行锁,这是我期望的行为。

@NoazDad是一个非常有经验的PowerBuilder人,尽管他目前在SO上有71分。我会接受他的建议(,这也是我的工作方式)。

+0

数据库是SQL Anywhere 12.是否有可以更改的datawindow属性,以便它不锁定行? – voon

+0

对不起,我不知道SA了。 – DaveE

2

如果你用这种方式更新数据库已经死了,那么我会看看你的数据窗口显示记录列表。也许嵌入式SQL试图更新锁定的数据,我认为这可能会导致挂起。锁应显示在数据库上。如果您没有通过数据窗口进行更新,请考虑选择“只读”。

我得到了一个印象(来自对原始问题的评论),您可以执行更新,但该更改没有持续存在于数据库中。这是常见的解决方案。它可能是其中的任何一种,可能就是其中之一。答案取决于您用于更新的方法。

  • 如果你通过键盘在一个数据窗口改变了列值,或比DataWindow控件或标签进行AcceptText出列,以确保该列值被接受进入缓冲区更新的setText。 IE:dw_1.AcceptText()
  • 如果你已经完成了一个接受文本(没有错误),然后像dw_1.Update()一样执行数据窗口更新,并确保返回代码是好的。
  • 逻辑事务完成后,运行嵌入式SQL语句:COMMIT;在dbms中提交更改。
  • 如果您通过嵌入式SQL进行更新,请确保您始终在命令后检查SQLCA.SQLCODE。它应该是零,或者100没有找到,对于错误是不利的。
  • 如果您从datawindow进行更新,数据窗口是否标记为“可更新”?编辑数据窗口时需要使用行 - >更新属性...
+0

谢谢。我一直在尝试SetItem方法而不是嵌入式SQL,但在阅读时,遇到了困难,导致DB中的更改持续存在。您的第一个4点被检出,然后到达'更新属性'中的最后一个,并注意到一些缺失的位:没有选择可更新的列,没有设置标识列(虽然选择了唯一的键列)。我修复了这两个项目,并且...... PowerBuilder在dw.Update()调用中冻结了。看起来我已经回到原点了。 :( – voon

+0

我想到了一些你可以检查的东西,一个是,你在数据窗口中有一个where子句,并且你是否使用正确的标准指定了更新属性,以便它能找到唯一的行?我假设是 - 所以现在我建议将日志记录到位,并确定它是否在“Update”语句中崩溃。您正在使用哪种数据库驱动程序?是否可以从开发模式更新数据窗口,也许可以尝试?如果你陷入困境,并希望更多的想法打我 - 我最近有点想念PB故障排除。哦,是的,DB触发器呢?他们可能会导致更新的破坏。 –

1

什么样的数据类型是COMMENTS表中的列comment_text?你期望支持多少个角色?

如果您正在从PowerBuilder嵌入式SQL更新大型文本或二进制数据,则使用UPDATEBLOB语句执行此操作。

Blob lBlob 
bBlob = Blob(var_containing_large_string) 
UPDATEBLOB COMMENTS 
SET comment_text = :lBlob 
WHERE ID = :lngID 
USING trans_object ; 

请检查设置BinTxtBlob的文件,并在SELECTBLOB和UPDATEBLOB声明: http://infocenter.sybase.com 该文档是令人困惑,因为它规定列必须是类型的“斑点”,但是这包括文本数据类型(可以从BinTxtBlob设置的文档中看到)。

+0

该列是_long nvarchar_。 我设计的评论是无限的,但实际上200字左右已经足够了。 感谢您的建议,我会尝试UPDATEBLOB或将列更改为常规长度nvarchar类型。 – voon

+0

ASA long varchar对应于PowerScript BLOB类型,如此处所述,例如: http://www.sybase.ca/detail?id=44008 像这样的数据库类型不由数据窗口或标准嵌入SQL功能。如果您不需要支持长文本,请更改列数据类型。否则,您将需要使用SELECTBLOB和UPDATEBLOB。 – WizzleWuzzle

+0

所以我终于用nvarchar(200)来测试这个...仍然没有去。不管怎么说,多谢拉。 – voon