小编Jon*_*ins的帖子

在Firebird上使用服务器端时,如何不浪费Generator值?

检查这段使用生成器的简单代码,在Firebird表中创建唯一的主键:

CREATE OR ALTER TRIGGER ON_BEFOREINSERT_PK_BOOKING_ITEM FOR BOOKING_ITEM BEFORE INSERT POSITION 0
  AS
  BEGIN
    IF ((NEW.booking_item_id IS NULL) OR (NEW.booking_item_id = 0)) THEN BEGIN
      SELECT GEN_ID(LastIdBookingItem, 1) FROM RDB$DATABASE INTO :NEW.booking_item_id;
    END
  END!
Run Code Online (Sandbox Code Playgroud)

此触发器抓取并增加然后为预订项ID分配生成的值,从而为BOOKING_ITEM表创建自动递增的密钥.触发器甚至检查尚未为预订ID分配值.

问题是如果由于某种原因无法发布BOOKING_ITEM记录,则自动递增的值将丢失(浪费).

关于如何避免这种浪费,我有几点想法,但对每一个都有顾虑.他们来了:

  1. 如果发生发布错误,请减少计数器.在触发器中,我设置了一个try-except块(在Firebird PSQL中是否存在try-except块?)并运行一个SELECT GEN_ID(LastIdBookingItem, -1) FROM RDB$DATABASEon post exception.这会有用吗?如果另一个交易在我减少之前潜入并增加发电机怎么办?这真的搞砸了.

  2. 使用临时ID.将id设置为某个唯一的临时值,我将其更改为触发器AFTER INSERT时所需的生成器值.这种方法感觉有点人为,需要一种方法来确保temp id是唯一的.但是如果在客户端提供了booking_item_id,我该如何区分它与临时ID?另外我需要另一个触发器

  3. 使用交易控制.这与选项1类似.除了使用try-except块重置生成器之外,我启动一个事务,然后在记录无法发布时将其回滚.我不知道使用事务控制的语法.我以为我在某处读过PSQL中不允许SAVEPOINT/SET TRANSACTION.此外,回滚必须在AFTER INSERT触发器中发生,所以我再次需要另一个触发器.

对于任何想要使用Generators的Firebird开发人员来说,这肯定是一个问题.还有其他想法吗?有什么我想念的吗?

sql firebird triggers generator auto-increment

5
推荐指数
1
解决办法
712
查看次数

Delphi TStringList Free导致异常

考虑这个简短的Delphi程序:

procedure TfrmXQuery.FieldListFillFromDefault;
var
  field_list: TStringList;
begin
  try
    if x <> '' then begin
      field_list := TStringList.Create;
      {do some stuff with field_list}
    end;
  finally
    if field_list <> NIL then 
    begin
      field_list.Free;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

当我在Delphi 3中运行它时,x =''以便永远不会创建field_list,

  1. 为什么field_list <> NIL
  2. 对象未初始化为NIL
  3. 如果它不是NIL什么?
  4. 如果它没有分配,NIL我怎么不知道Free它是否?该Assigned功能并没有告诉我:if Assigned(an_object)相当于if an_object = NIL

delphi delphi-3

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

如何在Delphi搜索路径中使用系统变量?

在Delphi XE2中,我正在设置搜索路径。我想使用我定义的系统变量来缩短搜索路径中使用的各个文件夹的字符串。

我这样做是这样的:

Search path         : x:\Delphi Library\XTools;x:\Delphi Library\XDiag;
I define variable   : L = x:\Delphi Library
Search path using L : $(L)\XTools;$(L)\XDiag;
Run Code Online (Sandbox Code Playgroud)

如果我不使用定义的环境变量,即完全写出路径,那么一切都很好,但是如果我确实使用环境变量,则编译器将无法理解搜索路径。

我一直在使用Delphi 3,它比XE2简单得多,所以也许我没有在正确的位置指定路径或变量:

路径在这里指定:

项目经理|项目|选项| Delphi编译器|定位所有配置-所有平台|搜索路径

在此指定变量:

项目经理|项目|选项|调试器|目标:所有配置-所有平台|环境块|用户覆盖

delphi options search-path delphi-xe2

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

你能和"和"jQuery选择器一起吗?

例如,假设您有以下内容:

<div id=1 class="a b c">...
<div id=2 class="b y c">...
<div id=3 class="b y x">...
<div id=4 class="c b">...
<div id=5 class="x 1 y">...
Run Code Online (Sandbox Code Playgroud)

我如何选择具有class="b"AND 的元素class="c"?

我正在寻找一个识别div的选择器 id=1, 2, and 4.

jquery jquery-selectors

0
推荐指数
1
解决办法
359
查看次数