我现在在设计一个C/S程序(BDE+MSSQL 2000),数据库中有一个表A用来保存记录,因其中的数据较多,所以创建了一个与表A结构相同的空表;因考虑到多用户使用的情况,所以使用了Query的CacheUpate,现有问题如下:
1、如何不进行ApplyUpdates将Query中的记录一次性地Append到表A中?目前我用的是BatchMove组件
我没有对Query使用ApplyUpdates的时侯出现:
Invalid BLOB handle in record buffer
使用了ApplyUpdates的时侯出现:
Not exact read/write
File: ../del1.MB
File: ../del1.MB
2、如何实现与Query相关联的DBGrid的记录插入效果?表中无关键字段,其中序号字段是某一类型单据的序号,目前我使用的方法是:
procedure InsRec(Dataset:Tdataset);
var
  aField : Variant ;
  i,no: Integer ;
begin
  with query do
  begin
//得到插入前的序号
    no:=FieldByName('序号').AsInteger;
    append;
    last; //到最后一条记录
//当前序号大于插入前的序号时复制记录
    while FieldByName('序号').AsInteger>no do
    begin
       prior;//到第i-1条记录开始读入
       aField := VarArrayCreate([0,DataSet.Fieldcount-1],VarVariant);
       for i := 0 to (DataSet.Fieldcount-1) do begin
          aField[i] := DataSet.fields[i].Value ;
       end;
       next;//到第i条记录开始写入
       for i := 0 to (DataSet.Fieldcount-1) do begin
          DataSet.fields[i].Value := aField[i] ;
       end;
       Prior;//这条记录写完后定位到上一条
    end;//end while
  end;//end with
end;
问题是记录并没有下移,而是追加了一条空记录,谢谢老师们帮忙调试、改正下。这个贴子给分66,希望大家在新的一年66大顺,万事如意  :)

解决方案 »

  1.   

    注释中的i应为j,呵呵,大家应该能看出来,此i非彼i,乃笔误
      

  2.   

    第一个问题我用视图跳过了表间复制的问题,不过还是想了解怎么解决这个问题。
    第二个问题是不是因为使用了Query的CacheUpate,操作的记录在内存中,而循环读写的时侯是对真实的数据集操作的原因?
      

  3.   

    我经常这样写,用个tstringlist保存当前记录,从没错过
    var  list:tstringlist;
    begin
    list:=tstringlist.create;
    while FieldByName('序号').AsInteger>no do
        begin
           prior;//到第i-1条记录开始读入
           for i := 0 to DataSet.Fieldcount-1 do begin
              list.add(DataSet.fields[i].asstring);
           end;
           next;//到第i条记录开始写入
           for i := 0 to list.count-1 do begin
              DataSet.fields[i].asstring:= list.strings[i]
           end;
           Prior;//这条记录写完后定位到上一条
        end;//end while
    end;
      

  4.   

    谢谢楼上的朋友
    有哪位能帮忙解决一下吗,说一下解决方法,程序是固定的,办法是活的啊,谁有成功实现过DBGrid中插入效果的方法没有?
      

  5.   

    表中无关键字,其中单号、序号、制单时间可以确定记录的唯一性;DBGrid的数据集为ClientDataSet,使用ClientDataSet查询返回某单号的所有记录;如果在查询语句中使用了‘order by 序号’的话就会出现:在奇/偶数序号记录进行插入时只改变序号为奇/偶数的记录(我用了一个循环改变序号值),不使用order by时一切正常。
    问题:如何实现DBGrid中的排序效果?
      

  6.   

    1.使用oracle提供的數據庫驅動
    2.不明白
      

  7.   

    在ClientDataSet的IndexDef属性中建立一个索引,然后指定索引的Fields属性为需要排序的列名,可以有一列或多列,
    如果是多列的话,列名与列名之间用分号隔开,然后再需要排序的时候指定它的索引为刚才建立的索引名就可以了,指定
    索引名的办法为:
    for I := 0 to cds.IndexDefs.Count - 1 do  //CDS指的是我的ClientDataSEt
      if cds.IndexDefs.Items[I].Fields = 'astr;bint' then  //我需要按列Astr和列Bint排序
        begin
        cds.IndexName := cds.IndexDefs.Items[I].Name;
        end;
      

  8.   

    因为只有一列(序号)需要排序,我在属性栏中将IndexDef属性中建立了索引,索引字段为序号字段,然后直接指定IndexName为序号字段,运行程序后还是没有排序;在程序中动态指定IndexName也不行:
    var
       i:integer;
    begin
       with CDS do
       begin
          Close;
          CommandText:='Select * from bill where billnum='''+DH.Text+'''';
          try
             for i:=0 to IndexDefs.Count-1 do
             begin
                if IndexDefs.Items[i].Fields='no' then
                   IndexName:=IndexDefs.Items[i].Name;
             end;
             Open;
          except on E:Exception do
             begin
                MessageDlg(E.Message,mtError,[mbOK],0);
                Close;
                exit;
             end;//end except
          end;//end try
       end;//end with
    end;