• 在VF中像本地表一样使用ADO远程数据表 VF9.0中使用CursorAdapter更新数据


    VF中,我们可以通过ADO来取得数据并且可以绑定到窗体上
    但是ADO使用使用起来并不是那么方便,比如不能方便地插入,更新数据,而在VF的本地环境中,如果加载了数据环境
    那么这一切就变得比较轻松了,

    这里我们可以做使用VF自带的数据环境中的ADO的自动生成CursorAdapter
    的向导来,为我们生成相关的代码,然后加以改造就可以了
    生成的SCX文件用EditPlus或者UtlraEdit打开就可以了,可以从里边清楚地看到代码
    以下是我改造的一段代码


    Define Class Data1 As DataEnvironment && 数据环境类
     Name = "Dataenvironment"
     
     Top = 220
     Left = 1
     Width = 520
     Height = 200
     Datasource = .Null.
     DataSourceType = "ADO" 

     Procedure BeforeOpenTables
     *** Select connection code: DO NOT REMOVE

     Local loConnDataSource
     loConnDataSource = Createobject('ADODB.Connection')
     ***<DataSource>
     
     &&loConnDataSource.ConnectionString = [Provider=SQLOLEDB.1;Password=cxy;Persist Security Info=True;User ID=sa;Ini] + ;
     && [tial Catalog=bussetup;Data Source=.;]
     
     loConnDataSource.ConnectionString = conString
     ***</DataSource>
     loConnDataSource.Open()
     This.Datasource = Createobject('ADODB.RecordSet')
     This.Datasource.CursorLocation   = 3  && adUseClient
     This.Datasource.LockType         = 3  && adLockOptimistic
     This.Datasource.ActiveConnection = loConnDataSource
     *** End of Select connection code: DO NOT REMOVE

     ENDPROC
     
    Enddefine && 添加 Cursor 类对象 
     
     
     
     

    DEFINE CLASS demo as CursorAdapter
    UseDeDataSource= .T.
     
    SelectCmd="select * from ........."
     

    CursorSchema ="ID I, 日期 T"
     

     

    Alias = "demotable"
    Flags = 0
    KeyFieldList = "ID"
    Tables = ".......D"
    UpdatableFieldList = "................"
    UpdateNameList = "......................."
    UseCursorSchema = .T.
    Name = "demo"


     Procedure Init
     *** Setup code: DO NOT REMOVE
     Local llReturn
     Do Case
     Case Not Pemstatus(This, '__VFPSetup', 5)
      This.AddProperty('__VFPSetup', 0)
     Case This.__VFPSetup = 1
      This.__VFPSetup = 2
     Case This.__VFPSetup = 2
      This.__VFPSetup = 0
      Return
     Endcase
     Set Multilocks On
     llReturn = DoDefault()
     *** End of Setup code: DO NOT REMOVE

     *** Setup code: DO NOT REMOVE
     If This.__VFPSetup = 1
      This.__VFPSetup = 2
     Endif
     Return llReturn
     *** End of Setup code: DO NOT REMOVE

     Endproc
     Procedure AutoOpen
     *** Setup code: DO NOT REMOVE
     If Not Pemstatus(This, '__VFPSetup', 5)
      This.AddProperty('__VFPSetup', 1)
      This.Init()
     Endif
     *** End of Setup code: DO NOT REMOVE

     Endproc


    ENDDEFINE


    &&这是一些表格
    DEFINE CLASS grdDemotable as Grid
    columnCount = 29
    Left = 48
    RecordSource = "demotable"
    RecordSourceType = 1
    Top = 24
    Name = "grdDemotable"
    Column1.ControlSource = "demotable.id"
    Column1.Name = "Column1"
    ................
    ...............
    ENDDEFINE

    Define Class cxyform As Form
     Top = 0
     Left = 0
     Height = 386
     Width = 587
     DoCreate = .T.
     Caption = "cxyform"
     Name = "FORM1"
     
     DataEnvironment="" && DataEnvironment 是表单的一个属性

     Procedure Destroy 

     Try
      Thisform.DataEnvironment.CloseTables && 在 destroy 过程的结束处关闭表
     Catch To mException
       RETURN .f.
     ENDTRY
     
     thisform.Hide
     Clear Events
     ENDPROC
     
     
     Procedure Unload 
     Clear Events
     
     ENDPROC
     
     Procedure Load
     * DataEnvironment 被实例化,且表单的属性
     * DataEnvironment 引用该对象. DataEnvironment
     * 并没有实际地添加到表单. THISFORM.DATAENVIRONMENT
     * 只是一个指向 DataEnvironment 对象的指针.
     myde=Createobject("Data1")
     Thisform.DataEnvironment=myde
     myde.ADDOBJECT("demoname", "demo")
     &&myde.demoname.selectcmd="select top 10 * from ................"
     myde.demoname.selectcmd=comSql

     
     * 在 LOAD 开始时打开表.
     Thisform.DataEnvironment.OpenTables
     thisform.AddObject("bb","grdDemotable")
     thisform.bb.visible=.T. 
     thisform.bb.Width=thisform.Width
     thisform.bb.Height=thisform.Height
     thisform.bb.Top=0
     thisform.bb.Left=0  
     
     
     thisform.bb.Column1.visible=.f. 
     thisform.bb.Column2.visible=.f. 
     thisform.bb.Column3.visible=.f.
     thisform.bb.Column4.visible=.f. 
     thisform.bb.Column5.visible=.f.
     thisform.bb.Column6.visible=.f.
     thisform.bb.Column7.visible=.f.
     thisform.bb.Column8.header1.caption="站点名称"
     thisform.bb.Column9.header1.caption="全票"
     
     thisform.bb.Column12.visible=.f.
     thisform.bb.Column13.header1.caption="结进金额" 
     

     
     BINDEVENT(this,"Resize",this,"changesize")
      
     ENDPROC 
     
     PROCEDURE changesize
      thisform.bb.width=thisform.Width
      thisform.bb.height=thisform.Height
     ENDPROC
     

    Enddefine

  • 相关阅读:
    The Node.js Event Loop, Timers, and process.nextTick()
    Main event loop
    Why should I avoid blocking the Event Loop and the Worker Pool?
    HTML Standard系列:Event loop、requestIdleCallback 和 requestAnimationFrame
    在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
    多线程 主线程
    mvvm
    跨库事务
    nginx 死循环
    nginx proxy pass redirects ignore port
  • 原文地址:https://www.cnblogs.com/sunbingzibo/p/1243477.html
Copyright © 2020-2023  润新知