我现在在设计一个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、如何不进行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大顺,万事如意 :)
第二个问题是不是因为使用了Query的CacheUpate,操作的记录在内存中,而循环读写的时侯是对真实的数据集操作的原因?
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;
有哪位能帮忙解决一下吗,说一下解决方法,程序是固定的,办法是活的啊,谁有成功实现过DBGrid中插入效果的方法没有?
问题:如何实现DBGrid中的排序效果?
2.不明白
如果是多列的话,列名与列名之间用分号隔开,然后再需要排序的时候指定它的索引为刚才建立的索引名就可以了,指定
索引名的办法为:
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;
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;