[VB]RS和DBGrid的相关操作

来源:互联网 发布:网络投诉电话多少 编辑:程序博客网 时间:2024/04/29 13:41

1:关于记录集(RecordSet)的操作
 有很多时候需要用到自己创建空记录集,并操作记录集,对于它的操作我遇到以下两类:
 A:填充自定义数据。(原因是数据不能根据一句SQL得到,但还要只得到一个记录集)
  解决方法:创建空记录集,根据需求创建记录集的Fields,然后往记录集中填充由多种途径获取的数据
  例子:
   Step1:创建空记录集
    Set objRS_Temp=New ADODB.RecordSet
   Step2:向记录集中插入栏位并打开记录集
    objRS_Temp.Fields.Append "FieldName1",adVarChar,20
    objRS_Temp.Fields.Append "FieldName2",adVarChar,50
    ......
    objRS_Temp.Open
   Step3:循环插入数据
    objRS_Return.AddNew
     objRS_Temp.Fields("FieldName1").Value="Value1"
     ......
    objRS_Return.Update
 B:利用记录集进行排序(多数情况是和SSDBGrid相关)
  解决方法:首先创建空的记录集,并将SSDBGrid中的数据存放于记录集之中,利用记录集的Sort方法进行排序,经数据重新Load到SSDBGrid
  例子:
   Step1:获取Grid栏位名称并创建空记录集
    ''''循环获取Grid的栏位名称
    FieldName1=grd.Columns(0).Name
    FieldName2=grd.Columns(1).Name

    Set objRS_Temp=New ADODB.RecordSet
   Step2:向记录集中插入栏位并打开记录集
    objRS_Temp.Fields.Append "FieldName1",adVarChar,20
    objRS_Temp.Fields.Append "FieldName2",adVarChar,50
    ......
    objRS_Temp.Open
   Step3:循环插入数据
    objRS_Return.AddNew
     objRS_Temp.Fields("FieldName1").Value="Value1"
     ......
    objRS_Return.Update

   Step3:按照特定栏位进行排序
    objRS_Temp.Sort = "FieldName1 DESC"
   Step4:循环将记录集中数据填充到SSDBGrid
  注意点1:对于Step2中,栏位类型开始的时候我采用的是adBSTR(采用UniCode编码的字符串型),结果记录集的Sort方法不可用,
      分析原因是由于数据库中对于Unicode编码的字符串是不支持排序的。所以后来改为adVarChar的类型。类型后面的20和50则
      表示当前栏位的最大长度,应尽量与原数据保持一致。
  注意点2:在ASP中使用该方法,注意栏位类型要在页首枚举(如CONST adVarChar = 200)
    附:DataTypeEnum(数据类型枚举对应表)
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdcstdatatypeenum.asp

Private Sub Command1_Click()
    Dim objRS As ADODB.Recordset
    Dim conn As ADODB.Connection
    Dim connstring As String
    Dim strsql As String
    Dim inti As Integer
    Dim intJ As Integer
   
    connstring = "DSN=db;UID=uid;PWD=pwd"
   
    ''''获取空记录集,请将栏位根据情况补充完整
    ''
    strsql = "SELECT '' AS SYSTEM,'' AS PROCESS,'' AS SUBPROCESS,'' AS STARTDATETIME FROM dual"
   
    Set conn = New ADODB.Connection
   
    ''''打开连接,并设置为客户端游标
    ''
    conn.Open connstring
    conn.CursorLocation = adUseClient
   
    Set objRS = New ADODB.Recordset
   
    ''''设置为动态游标
    ''
    objRS.Open strsql, conn, adOpenDynamic, adLockBatchOptimistic
   
    ''''对得到的记录集进行操作
    ''
    objRS.MoveFirst
   
    ''''放在循环之中,指定添加多少笔记录进入记录集
    ''
    For intJ = 0 To 5
       
        ''''对每列进行赋值操作
        ''
        For inti = 0 To objRS.Fields.Count - 1
            objRS.Fields(inti).Value = "test" & inti
        Next
       
        ''''移动到下一行,并增加新的一行
        ''
        objRS.MoveNext
        objRS.AddNew

    Next
   
    ''''删除掉最后增加的一行空记录
    ''
    objRS.Delete adAffectCurrent
    ''''移动到有效行
    ''
    objRS.MovePrevious
   
    MsgBox objRS.RecordCount

End Sub

2:关于SSDBGrid的一个小注意事项
 SSDBGrid的属性grd.Row返回的值并不是选中Row在整个SSDBGrid中的绝对RowID,实际上是Grid当前可见部分的顺序值(以当前可见的第一条为0开始计数),
 所以这个方法就不能够正确地达到我们的目的。
 解决方法:采用Bookmark来定位到当前选定行并返回该行的RowID
 例子:intRowID=grdQVL.AddItemRowIndex(grdQVL.Bookmark)这样返回的才是当前选定行的绝对RowID

原创粉丝点击