小编Ana*_*oge的帖子

从语句中删除别名的表变量

我想根据同一个表中其他行的存在从SQL Server 2000/2005表变量中删除行(如果存在具有相同日期的非0计数行,则删除所有0个计数行).这是一个简单的示例,应该只删除首先添加的行:

declare @O table (
    Month datetime,
    ACount int NULL
)

insert into @O values ('2009-01-01', 0)
insert into @O values ('2009-01-01', 1)
insert into @O values ('2008-01-01', 1)
insert into @O values ('2007-01-01', 0)

delete from @O o1
where ACount = 0
  and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0)
Run Code Online (Sandbox Code Playgroud)

问题是我无法让SQL服务器接受表变量的o1别名(我认为由于o1.Month = o2.Month匹配字段名称而需要别名).错误是:

Msg 102,Level 15,State 1,Line 11

'o1'附近的语法不正确.

sql sql-server alias

41
推荐指数
2
解决办法
3万
查看次数

Delphi:通过报告锁定"失败"的运行线程的调用堆栈来调试关键部分挂起

我正在寻找一种方法来调试罕见的Delphi 7临界区(TCriticalSection)挂起/死锁.在这种情况下,如果一个线程正在等待一个关键部分超过10秒,我想生成一个报告,其中包含当前锁定关键部分的线程的堆栈跟踪以及无法执行的线程在等待10秒后锁定关键部分.如果引发异常或应用程序终止,则可以.

如果可能的话,我宁愿继续使用关键部分,而不是使用其他同步原语,但如果需要可以切换(例如获得超时功能).

如果工具/方法在IDE之外的运行时工作,这是一个奖励,因为这很难按需重现.在极少数情况下,我可以复制IDE内部的死锁,如果我尝试暂停以开始调试,IDE就会无所事事,并且永远不会进入我可以查看线程或调用堆栈的状态.不过,我可以重置正在运行的程序.

更新:在这种情况下,我只处理一个关键部分和2个线程,所以这可能不是锁定排序问题.我相信有一个不正确的嵌套尝试跨越两个不同的线程进入锁定,这会导致死锁.

delphi multithreading deadlock critical-section

8
推荐指数
1
解决办法
4043
查看次数

使用软件/虚拟COM端口和另一端的控制台/终端调试COM端口读/写

我有一个Delphi应用程序读取/写入连接到大型硬件设备的COM端口,所以我通常在开发过程中没有可用的硬件.也就是说,通信协议相当简单,所以我通常可以进行开发并让某人现场测试它,它通常可以工作.但有时候我遇到了一个更难的问题.为了解决这个问题,我想设置一个虚拟COM端口,COM端口的一端是我的应用程序,另一端是一个非常简单的COM端口调试控制台(类似于旧的调制解调器终端程序),其中ASCII命令我的应用程序发送已登录屏幕,我可以输入一些ASCII命令发送回我的应用程序以模拟硬件设备.我一直无法找到任何提供虚拟/软件COM端口和控制台/终端进行调试的工具.

软件/虚拟COM端口和终端需要支持Windows 7 64位(如果需要,还需要Vista 32).

delphi debugging serial-port virtual-serial-port

5
推荐指数
2
解决办法
4458
查看次数

从继承父弹出菜单停止VCL子控件

我有一个Delphi 2007 VCL TPanel,分配了TPopupMenu.面板上有一些TEdit控件.编辑继承父面板的弹出菜单.我想不允许这个弹出窗口继承,所以编辑将显示默认的Windows TEdit弹出菜单,包括复制,剪切,粘贴等,但还没有找到办法.似乎没有"ParentPopupMenu"类型属性来设置哪些控件从父组件继承它.

delphi inheritance parent popupmenu delphi-2007

4
推荐指数
1
解决办法
1343
查看次数

Delphi:Char和TCharArray数组"不兼容的类型"

我在下面的评论中遇到过几次"不兼容类型"错误,并且从未对Delphi 2007中没有直接支持的原因感到满意:

program Project1; {$APPTYPE CONSOLE}

type TCharArray = array of Char;

procedure DoArray(Chars: array of Char);
begin
end;

function ReturnTCharArray: TCharArray;
var CharArray: TCharArray;
begin
  Result := CharArray;
end;

begin
  DoArray(ReturnTCharArray); // [DCC Error] Project1.dpr(18): E2010 Incompatible types: 'Array' and 'TCharArray'
end.
Run Code Online (Sandbox Code Playgroud)

是不是可以将数组类型"别名"为另一个彼此兼容的数组类型?假设我无法更改DoArray的声明(它是第三方库的一部分),我如何编写一个返回与DoArray的param兼容的char数组的函数?直截了当的"函数ReturnAChar:Char数组;" 导致"标识符预期但发现'ARRAY'"错误.我甚至尝试将返回数组的函数更改为带有var"array of char"pram的过程,但是这也不允许在过程中设置"Char数组"参数的长度("Constant对象不能传递作为var参数").

arrays delphi types char

3
推荐指数
1
解决办法
4313
查看次数

Delphi:当退出应用程序时表单无法释放时该怎么办

我正在使用Delphi(7-2010)并试图找到一种处理异常的好方法,同时释放应用程序的形式.应用程序有几种由Application对象拥有的表单.当用户注销时,我需要释放所有现有表单,以便不维护用户状态,然后显示登录的下一个用户的登录对话框.

有时,尝试释放其中一个表单时会发生异常.这会将表单保留在内存中,但是处于未知/不可用状态,因此我不能将表单重新用于下一个用户,而且我也无法从内存中删除它.因为表单是由应用程序拥有的,所以我无法直接为下一个用户创建表单的新版本,因为它会导致VCL中的"A组件名为MyForm已经存在"错误,我有点厌恶无论如何要在内存中使用旧的表单实例.

我想看看其他人在这种情况下会做些什么.以下是一些想法:

  • 当您收到这些例外情况时终止应用程序,因此您一定要清除平板.用户无论如何都要注销,因此可能已经完成了应用程序.如果需要,可以选择重启应用.
  • 使表单不属于Application,因此您可以创建它们的多个实例,并确保至少隐藏任何不可释放/损坏的表单.
  • 动态生成每个表单的名称,或将其设置为空白,因此永远不会有重复的名称,并且VCL中没有"已存在"错误.
  • 编写一个应用程序,以便在释放对象时永远不会有异常(不切实际 - 我需要针对意外错误的应急计划).


我的解决方案是上面的原始想法之一.我在循环周围添加了一个try/except块来释放表单,如果有异常,我会向用户显示错误消息而不提高它,然后调用ExitProcess(0)立即终止应用程序.

forms delphi free exception logout

1
推荐指数
2
解决办法
1269
查看次数