在BCB中,通过TQUERY删除VFP的一表记录后,如何PACK掉该表的被删除记录?

HonJerson 2001-01-15 09:48:00
各位大虾,请教一个问题:前台是BCB 通过ODBC连接VFP数据库,语句如下:
int RecNum;
if( Dm->temp_hj103SQL->Active)
Dm->temp_hj103SQL->Close();
Dm->temp_hj103SQL->SQL->Clear();
Dm->temp_hj103SQL->SQL->Add("select * from temp_hj103" );
Dm->temp_hj103SQL->Open();
RecNum = Dm->temp_hj103SQL->RecordCount;
if (RecNum > 0)
{
Dm->temp_hj103SQL->Close();
Dm->temp_hj103SQL->SQL->Clear();
Dm->temp_hj103SQL->SQL->Add("delete from temp_hj103" );
Dm->temp_hj103SQL->Prepare();
Dm->temp_hj103SQL->ExecSQL();
Dm->temp_hj103SQL->Close();
Dm->temp_hj103SQL->SQL->Clear();
Dm->temp_hj103SQL->SQL->Add("pack temp_hj103" );
Dm->temp_hj103SQL->ExecSQL();
}

在运行到最后一句Dm->temp_hj103SQL->ExecSQL();时出错:"Key violation.[Microsoft][ODBC Visual Foxpro Driver]Cannot open file ...\temp_hj103.dbf"
请问各位如何解决?

...全文
145 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCB 2001-01-16
  • 打赏
  • 举报
回复
不用客气,分就免了。
下面一个问题我也不知道。
HonJerson 2001-01-16
  • 打赏
  • 举报
回复
Hi,BCB(Inprise):
1。谢谢你告诉我“DbiPackTable(Table1->DBHandle,Table1->Handle,
NULL,szDBASE,true);”这个函数。我曾化了很多时间才知道“pack temp_hj103”。
不知如何把分数给你?望告知。
2。“独占”这个属性,在定义数据源时我用过。Exclusive是true或false,我都试过。
程序如下:
int pos = Application->ExeName.LastDelimiter("\\");
Reg->LazyWrite = false;
Reg->RootKey = HKEY_LOCAL_MACHINE;
DllPath = Application->ExeName.SubString(1, pos) + "VFPODBC.DLL";
NewPath = Application->ExeName.SubString(1, pos) + "DATA\\ESS.DBC";
if(!Reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\Ess_New", true))
return(false);
try
{
Reg->WriteString("BackgroundFetch", "Yes");
Reg->WriteString("Collate", "Machine");
Reg->WriteString("Deleted", "Yes");
Reg->WriteString("Description", "Create By Ess_Tran");
Reg->WriteString("Driver", DllPath);
Reg->WriteString("Exclusive", "No");
Reg->WriteString("Null", "Yes");
Reg->WriteString("SetNoCountOn", "No");
Reg->WriteString("SourceDB", NewPath);
Reg->WriteString("SourceType", "DBC");
}
catch(...)
{
return(false);
}
Reg->CloseKey();
if(!Reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\ODBC Data Sources", true))
return(false);
try
{
Reg->WriteString("Ess_New", "VFP Driver");
}
catch(...)
{
return(false);
}
Reg->CloseKey();
return(true);
但是没解决问题。

3。现在另有问题请教,在delete,pack掉数据后,我想再打开该表(用Tquery),程序如下:
(接 发表时间:2001-1-15 9:48:00)
if(Dm->temp_hj103->Active)
Dm->temp_hj103->Close();
Dm->temp_hj103->SQL->Clear();
Dm->temp_hj103->SQL->Add("select * from temp_hj103" );
Dm->temp_hj103->Open();
在Open时,出现问题:“General SQL error.[Microsoft][ODBC Visual Foxpro Driver] Command contains unrecognized phrase/keyword.”,但我估计问题不在SQL语句,
望赐教!

BCB 2001-01-15
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Table1->Close();
Table1->Exclusive=true;
try
{
Table1->Open();
}
catch(...)
{
}
if (Table1->Active)
{
DbiPackTable(Table1->DBHandle,Table1->Handle,
NULL,szDBASE,true);
Table1->Close();
}
else
{
ShowMessage("出错:不能独占打开!");
}
Table1->Exclusive=false;
Table1->Open();
}
TQuery没见到办法
BCB 2001-01-15
  • 打赏
  • 举报
回复
是否“独占”这个属性 在定义数据源时有一项(好象是“高级”)试试看;
另一个办法:有BDE32.HLP中的DbiPackTable(Table1->dbHandle,Table1->Handle,
NULL,szDBASE,true);
1.针对 TTable;
2.只能是Dbase或FoxPro
2.也要独占打开;
HonJerson 2001-01-15
  • 打赏
  • 举报
回复
hello bcb(Inprise):
谢谢你的回答,我估计也是“独占”问题,但是不知如何解决?在程序中我曾试图关闭过DM中的DATABASE,但是还是老问题,而在DESIGN时关闭一下DATABASE再打开,然后运行程序可解决独占问题,望赐教!
另外,Dm->temp_hj103SQL->SQL->Add("pack temp_hj103" );语句中,我试过该语句,可行!估计不是标准的SQL。
BCB 2001-01-15
  • 打赏
  • 举报
回复
Dm->temp_hj103SQL->SQL->Add("pack temp_hj103" );
SQL中有Pack吗?

BCB 2001-01-15
  • 打赏
  • 举报
回复
是不是与“独占”方式有关,
pack时,可能要以独占方式打开DBF,
将数据源改成独占方式试试!关注!

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧