paradox数据库的问题(63分)

  • 主题发起人 主题发起人 pjprobbi
  • 开始时间 开始时间
P

pjprobbi

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如下:
客户正常使用了一个多月,前两天突然打电话给公司,说程序不能正常运行,我过去看了之后,发现一部分程序能运行,一部分不能运行.当时我感到
非常奇怪.找了一上午也没找出问题,不得以我只得在客户的机子上把
delphi装上,把源程序也带过去了.然后用它的数据在dlephi里进行测试.
我写了一个简单的查询语句去查询一个表,比如:select * from qianyue
这个语句应该没有什么问题吧.但是结果让我惊讶,delphi竟然报错:
'table is full'. 这不可能啊.这个表里才800条记录,怎么可能满呢.
然后我用databasedesktop打开这个数据表,当我拖动垂直滚动条时,发现
竟然拖不完,当你拖完到最后一条记录时它并不会停止,而是又从第7条记录开时
循环,但又不是从第一条记录循环,到现在为止我知道了问题就出在这个数据表上
,但这是什么问题,以及如何解决就不知道了.
 
unit updateData;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DBTables, Db, FileCtrl;

type
TForm1 = class(TForm)
Label1: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Button1: TButton;
Label4: TLabel;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label5: TLabel;
Query1: TQuery;
Table1: TTable;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function CutLast(Str: String): String;
begin
Result := '';
if Str = '' then Exit;

if Str[Length(Str)] = '/' then Result := Copy(Str, 1, Length(Str) -1)
else Result := Str;
end;

procedure EmptyAFile(FileName: String);
var Table1 : TTable;
begin
Table1 := TTable.Create(Application);
Table1.DatabaseName := ExtractFilePath( FileName);
Table1.TableName := ExtractFilename(FileName);

Table1.EmptyTable ;

Table1.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var Dir1, Dir2, Appdir : String;
Count, Total : Integer;
begin
Dir1 := CutLast( Edit1.Text );
Dir2 := CutLast( Edit2.Text );
Appdir := CutLast( ExtractFilePath(Application.ExeName) );


if (Dir1 = '') or (Dir2 = '') then Exit;

Query1.Active := false;
Table1.Active := false;
Query1.DatabaseName := Dir1;
Table1.DatabaseName := Dir2;

if RadioButton2.Checked then
begin
if not FileExists(Dir1 + '/book.db') then
begin
MessageDlg('无法找到文件: '+ Appdir + '/book.db', mtError, [mbOK], 0) ;
end
else
begin
if not FileExists(Appdir+'/book.dbf') then
begin
MessageDlg('无法找到文件: '+ Appdir + '/book.dbf', mtError, [mbOK], 0) ;
Exit;
end;
if not FileExists(Appdir+'/book.mdx') then
begin
MessageDlg('无法找到文件: '+ Appdir + '/book.mdx', mtError, [mbOK], 0) ;
Exit;
end;

EmptyAFile(Appdir + '/book.dbf');

with Table1 do
begin
Active := False;
DatabaseName := Appdir;
TableName := 'Book.dbf';
Active := True;
end;

with Query1 do
begin
Active := False;
DataBaseName := Dir1;
SQL.Text := 'select * from book where logno <> "" order by logno';
Active := True;
end;

Total := Query1.RecordCount;
Count := 0;

Query1.First;
while not Query1.EOF do
begin
Table1.Append;

Table1.FieldByName('LogNo').AsString := Query1.FieldByName('LogNo').AsString;
Table1.FieldByName('BarCode').AsString := Query1.FieldByName('BarCode').AsString;
Table1.FieldByName('BookName').AsString := Query1.FieldByName('BookName').AsString;
Table1.FieldByName('Author').AsString := Query1.FieldByName('Author').AsString;
Table1.FieldByName('PubHouse').AsString := Query1.FieldByName('PublishHouse').AsString;
Table1.FieldByName('PubPlace').AsString := Query1.FieldByName('PublishPlace').AsString;
Table1.FieldByName('ISBN').AsString := Query1.FieldByName('ISBN').AsString;
Table1.FieldByName('ClassNo').AsString := Query1.FieldByName('ClassNo').AsString;
Table1.FieldByName('BookFormat').AsString := Query1.FieldByName('BookFormat').AsString;
Table1.FieldByName('PageNo').AsString := Query1.FieldByName('PageNo').AsString;
Table1.FieldByName('PubDate').AsString := Query1.FieldByName('PublishDate').AsString;
Table1.FieldByName('Price').AsString := Query1.FieldByName('Price').AsString;
Table1.FieldByName('BookCaseNo').AsString := Query1.FieldByName('BookCaseNo').AsString;
Table1.FieldByName('Memo').AsString := Query1.FieldByName('Memo').AsString;
Table1.FieldByName('LogDate').AsString := Query1.FieldByName('LogDate').AsString;
Table1.FieldByName('BookTopic').AsString := Query1.FieldByName('BookTopic').AsString;
Table1.FieldByName('Summary').AsString := Query1.FieldByName('Summary').AsString;
Table1.FieldByName('IsOut').AsString := Query1.FieldByName('IsOut').AsString;
Table1.FieldByName('SeriesName').AsString := Query1.FieldByName('SeriesName').AsString;
Table1.FieldByName('KindNo').AsString := Query1.FieldByName('KindNo').AsString;
Table1.FieldByName('InMode').AsString := '购';

Table1.Edit;
Table1.Post;

Query1.Next;

Inc(Count);

Label5.Caption := '已完成 ' + IntToStr(Count) + ', 总共 '+ IntToStr(Total)+' 条记录...';
Application.ProcessMessages;
end;

Label5.Caption := '任务已经完成, 正在拷贝数据库...';
Application.ProcessMessages;


CopyFile(Pchar(Appdir+'/book.dbf'), pchar(Dir2+'/book.dbf'), False);
CopyFile(Pchar(Appdir+'/book.mdx'), pchar(Dir2+'/book.mdx'), False);

MessageDlg('所有的任务都完成!', mtinformation, [mbOK], 0);
Label5.Caption := '';
Table1.Active := False;
// EmptyAFile(Appdir + '/book.dbf');
end;
end;

if RadioButton1.Checked then
begin
if not FileExists(Dir1 + '/Leader.db') then
begin
MessageDlg('无法找到文件: '+ dir1 + '/Leader.db', mtError, [mbOK], 0) ;
end
else
begin
if not FileExists(Appdir+'/leader.dbf') then
begin
MessageDlg('无法找到文件: '+ Appdir + '/leader.dbf', mtError, [mbOK], 0) ;
Exit;
end;
if not FileExists(Appdir+'/leader.mdx') then
begin
MessageDlg('无法找到文件: '+ Appdir + '/leader.mdx', mtError, [mbOK], 0) ;
Exit;
end;


EmptyAFile(Appdir + '/Leader.dbf');

with Table1 do
begin
DatabaseName := Appdir ;
TableName := 'Leader.dbf';
Active := True;
end;

with Query1 do
begin
Active := false;
DataBaseName := Dir1;
SQL.Text := 'select * from Leader order by LeaderNo';
Active := True;
end;

Total := Query1.RecordCount ;
Count := 0;

Query1.First;
while not Query1.EOF do
begin
Table1.Append;

Table1.FieldByName('Leader').AsString := Query1.FieldByName('Leader').AsString;
Table1.FieldByName('LeaderNo').AsString := Query1.FieldByName('LeaderNo').AsString;
Table1.FieldByName('LeaderType').AsString := Query1.FieldByName('LeaderType').AsString;
Table1.FieldByName('Avail').AsString := Query1.FieldByName('Avail').AsString;
Table1.FieldByName('ClassNo').AsString := Query1.FieldByName('ClassNo').AsString;
Table1.FieldByName('GradeNo').AsString := Query1.FieldByName('GradeNo').AsString;
Table1.FieldByName('FromDate').AsString := Query1.FieldByName('FromDate').AsString;
Table1.FieldByName('Sex').AsString := Query1.FieldByName('Sex').AsString;

Table1.Edit;
Table1.Post;

Query1.Next;

Inc(Count);

Label5.Caption := '已完成 ' + IntToStr(Count) + ', 总共 '+ IntToStr(Total)+' 条记录...';
Application.ProcessMessages;

end;

Label5.Caption := '任务已经完成, 正在拷贝数据库...';
Application.ProcessMessages;


CopyFile(Pchar(Appdir+'/leader.dbf'), pchar(Dir2+'/leader.dbf'), False);
CopyFile(Pchar(Appdir+'/leader.mdx'), pchar(Dir2+'/leader.mdx'), False);

MessageDlg('所有的任务都完成!', mtinformation, [mbOK], 0);
Label5.Caption := '';
Table1.Active := False;
// EmptyAFile(Appdir + '/leader.dbf');
end;

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Dir : String;
begin
Dir := '';

if selectdirectory('选择目录:', '我的电脑', dir) then Edit1.Text := dir;
end;

procedure TForm1.Button2Click(Sender: TObject);
var Dir : String;
begin
Dir := '';

if selectdirectory('选择目录:', '我的电脑', dir) then Edit2.Text := dir;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;

end.
转换数据库
 
不要 paradox 数据库,转换成其它的数据库吧,这个问题以前就有人问过,好像
没有解决, PARADOX 数据库太多问题了!
 
删除、重建index
不行的话
安装个paradox软件,有修理的功能
 
to :Pipi
怎么修复呢?能不能给个提示.
 
你下的修复软件就有说明呀,使用很简单的。
 
paradox自己有菜单啊,我也忘记了,long long ago用过paradox
 
to : hbezwwl
什么修复软件?能给个下载地址吗?或者直接发到我的邮箱:pjprobbi@sohu.com
 
你的程序中肯定有直接对table的操作,这样很容易坏掉的,最好全部table还成
query就没有问题,我的一个程序用paradox数据库有130M都没有问题,另一个用
了table的7000条就常常出错了。
 
用query很麻烦啊,用table就简单多了.
 
已经发给你了,请查收.
 
to : hbezwwl
好像没看到,我还有一个pjprobbi@chinaren.com的邮箱.
 
你为什么不用免费赠送的interbase呢,肯定是数据库文件出了问题,我觉得你好可怜,其实
没那么容易修复的,如果那么容易修复,人家就不会把数据库做得那么差劲,只要加个“自修复”功能不就好了
 
to: hbezwwl
已经收到了你的信,非常感谢!
 
// Pack a Paradox or dBASE table
// The table must be opened execlusively before calling this function...
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.Active = False then
raise EDatabaseError.Create('Table must be opened to pack');
if Table.Exclusive = False then
raise EDatabaseError.Create('Table must be opened exclusively to pack');

// 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
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if Props.szTableType = szDBASE then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
'type to pack');

Table.Open;
end;
 
索引问题,建议重建。
 
数据库出现问题,用工具软件修复一下即可,我帮你找找以前的贴子。
 
to : kingdeezj
能帮我找到以前的帖子就非常感谢了。
 
估计是索引问题,重建试试
 
非常感谢各位的不吝指教,特别感谢hbezwwl的修复工具。
 
后退
顶部