在PackTalbe一个DBF表时,为什么总是提示“表不是FoxPro表”?(100分)

  • 主题发起人 主题发起人 t365
  • 开始时间 开始时间
T

t365

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi对一个DBC数据库中的DBF表做删除操作,
DBC通过ODBC访问

下面是PackTable过程
procedure Tform1.PackTable(Table: TTable);
var
Props:CURProps;
begin
if not Table.Active then
raise EDatabaseError.Create('数据库没有打开');
if not Table.Exclusive then
raise EDatabaseError.Create('必须以独占方式打开');
Check(DbiGetCursorProps(Table.Handle, Props));
if (Props.szTableType = szFoxPro) then
DbiPackTable(Table.DBHandle, Table.Handle, nil, szFoxPro,True) ;
else
raise EDatabaseError.Create('表不是FoxPro表')
Table.Open;
end;

在一个按钮的单击事件中主调用Packtable
procedure TForm1.Button1Click(Sender: TObject);
begin
packtable(table1);
end;

table1在创建时己打开,但在按下Button1做Packtable时总是提示“表不是FoxPro表”
也就是说 Props.szTableType = szFoxPro 的条件为假,明明我的是FoxPro表
怎么会提示 不是FoxPro表,为什么呢?请朋友们帮忙告诉我啊!

我用szDBASE也式过了,不行。
我现在想可能是Delphi只能对自由表进行packtable的操作,
要想对DBC数据库中的表pack,可能需要先把表从dbc库中分离
出来,pack完之后再加到dbc库中,但我不知道怎么分离和添加
谁能告诉我?多谢啊!
 
试试下面的过程:
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if Table.Exclusive then begin
Table.close;
Table.Exclusive :=true;
end;
Table.open;
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure...
if (Props.szTableType = szPARADOX) then begin
FillChar(TableDesc, sizeof(TableDesc), 0); // Blank out the structure...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb))); // Get the database handle from the table's cursor handle...
StrPCopy(TableDesc.szTblName, Table.TableName); // Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType); // Put the table type in the table descriptor...
TableDesc.bPack := True; // Set the Pack option in the table descriptor to TRUE...
Table.close; // Close the table so the restructure can complete...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False)); // Call DbiDoRestructure...
end else if (Props.szTableType = szDBASE) then
// If the table is a dBASE table, simply call DbiPackTable...
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True));
end;
 
你最好在TABLE1的TABLETYPE属性设置成FOXPRO,然后试试看
 
多人接受答案了。
 
后退
顶部