如果以DBGRID作输入界面,有两个按钮,一个是"新增",一个是"提交",我想使用ADOQUERY来作,如何写这两个代码?要考虑网络上有其它用户也在使用此软件.后台用SQL SERVER.我不想让用户一打开DBGRID就占用后台此数据库.

解决方案 »

  1.   

    增加一个adoconnection.
    将adoquery1和adoquery2连接到adoconnection.在提交的时候
    try
      adoconnection.beginstran
        adoquery1.append;
        adoquery1.fieldbyname('fieldbyname').asstring:=edit1.text; 
        adoquery1.post;
      adoconnection.commit
    except
    adoconnection.rollback;
    end;
      

  2.   

    to : My_first(小@_@小)
    我的意思是用DBGRID作输入界面,且要在网络上运行,考虑多用户。
    “新增”和“提交”两个按钮。
      

  3.   

    在SQLSERVER里写存储过程,在DELPHI里调用
      

  4.   

    新增 :Open ;
    Insert ; //Append ;提交 :Post ;
      

  5.   

    TO: cg1120(代码最优化-§新年祝福你,好运伴着你§) ( )
    请详细些,不然不给分。我的分不多了。
      

  6.   

    在做数据库程序的时候尽量用存储过程来做,在前台调用就是了。
    用dbgrid来做输入界面,
    我上面写的代码只要放在提交的时候运行,为什么这样做。是为了减少当前用户锁定的时间,几乎可以不计,并发冲突最少,如果换成
    新增按钮代码
    adoconnection.beginstran
        adoquery1.append;提交按钮
    adoquery1.fieldbyname('fieldbyname').asstring:=edit1.text; 
        adoquery1.post;
      adoconnection.commit
    取消按钮
    adoconnection.rollback;这样做当用户点击新增按钮时,就一直锁定。直到用户按提交或者是取消。建议少用数据感知控件。 换成edit,
    无非多写了几行代码。
      

  7.   

    大侠们,如果以一般的EDIT 控件作输入界面,可以很容易控制后台数据库存的共享。因为只有在“提交”时,才报告事务和和数据库存的增加。
    但用DBGRID控件,如何在用户按“新增”时,只是向表单中添加数据,面不是已经打开后台数据库!同时又能使DBGRID的COLUMN得到输入焦点。如果这一点做到了,则“提交”时再执行真正的向数据库写数据和提交数据。
    不知大侠们是否明白我的意思?如果用存储过程,也必须经过“新增”的按钮,让COLUMN得到输入焦点,同时还有一个问题,在提交时要给存储过程赋参数,如何取得DBGRID的值。另外,如果用户修改了其它行,如何提醒用户“保存”呢?
      

  8.   

    TO:My_first(小@_@小)
    是的,首先感谢。
    我以前写程序时,都是用EDIT控件,但是有没有想过,EDIT作输入界面时,需要进行版面的安排,耽误时间。如能找到一个以DBGRID作输入界面且不要太长时间锁定后台数据库存的话,将使开发时间大缩短。如PB的数据窗口听说不错。另外DELPHI肯定可以解决。如珠海天心软件公司开发的FAS200大多是以GRID控件来开发的。但不知是不是DBGRID。
      

  9.   

    如要考虑网络上有其它用户也在使用此软件.后台用SQL SERVER.我不想让用户一打开DBGRID就占用后台此数据库,可以用触发器我存储过程来做!
    假设你ADOQUERY Component的所有其它属性都设置正确,并且你的ADOConnection 为Connection1
    "新增"按钮:
    ........
    try
      if Connection1.InTransaction then
        Connection1.RollbackTrans;
      Connection1.BeginTrans;
      with ADOQUERY do
      begin
        Active := False;
        Connection := Connection1
        SQL.Add('Select XX from XX where XX');
        Active := True;
        append;
      end;
    except
      Connection1.RollbackTrans;
    ......
    end;
     
    "提交"按钮:
    ......
    ADOQUERY.post;
    if Connection1.InTransaction then  
      Connection1.CommitTrans;
    .......
    end;
      

  10.   

    TO: Wally_wu(不想再写代码) 
    try
      if Connection1.InTransaction then
        Connection1.RollbackTrans;
      Connection1.BeginTrans;
      with ADOQUERY do
      begin
        Active := False;
        Connection := Connection1
        SQL.Add('Select XX from XX where XX');
        Active := True;
        append;//此时是在DBGRID中写数据吧?//这段代码中:上面不已经是锁住后台数据库了吗??????????????  end;
    except
      Connection1.RollbackTrans;
    ......
    end;
      

  11.   

    这个锁住后台数据库只不过不允许另外的用户同时操作(添加,删除和修改)同一条记录,(这种做法使数据更加安全)。
    但如果你怕锁住后台数据库, 你大可不用BeginTrans 方法。当你是使用网络数据库时,一个用户修改记录时没有锁住这条记录,而另一个用户又在修改或删除这条记录,你觉得这种做法合理吗?
      

  12.   

    TO: Wally_wu(不想再写代码) 
    这样说来,DBGRID作输入界面还是没法达到EDIT控件那样控制后台数据库存。用EDIT作输入界面。“新增”时根本不与后台打交道。只有在“提交”时才与后台打交道。请大侠们讨论。
      

  13.   

    DBGrid的每个格是可以定位的
    dbgrid1.FieldCount是行
    dbgrid1.SelectedIndex是列
      

  14.   

    Sql Server 2000 自己可以管理多用户下表写操作时锁定,也就是说, 每当写表时会自动锁定表 ,这个Sql Server 2000 可以做到 ; 只要写操作不多于两个没有必要用事务(加上也可以)-------------------------------------------   From My 大哥 and 我验证
      

  15.   

    数据集的LockType属性设为ltBatchOptimistic,保存时用updatebatch()
      

  16.   

    建一个临时表,用界面的DbGrid保存,提交时再用存储过程等访问后台数据库(事务或Cache都可以)
      

  17.   

    可以结了,Wally_wu(不想再写代码)得50分