線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1295
推到 Plurk!
推到 Facebook!

一个关于建立数据库的问题

答題得分者是:careychen
nadawudi
一般會員


發表:6
回覆:7
積分:2
註冊:2008-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-19 16:32:39 IP:221.200.xxx.xxx 訂閱
各位好,由于小弟才学编程不久,有一个问题困饶多日,请好心人帮忙解答:(使用的是delphi7)
是这样的我这里有一个控制软件,在主窗口的主目录第一项为"文件配置",点开还有许多子选项,其中有两项分别为"新建数据库"、"生成PC库"
我本来的想法是'新建数据库'选项用来新件mdb格式的库文件,而'生成PC库"选项用来生成dbf格式的库文件.
程序运行是没有什么问题,但是现在遇到一个问题就是,当我直接点"新建数据库"建立的是mdb库,这里还是正常,但是如果我先选则进了"生成PC库'选项,再退出来进"新建数据库'就只能建立dbf库,这个问题困饶我多日,到现在还没有解决,请好心人帮忙解决,谢谢
"新建数据库"选项代码如下:
[code delphi]
procedure TfrmMain.N50Click(Sender:TObject);
var
i:Integer;
ok:boolean;
mIniF:TIniFile;
fn:string;
begin
if sav.Execute then
begin
if FileExists(sav.FileName) then
begin
Application.MessageBox('数据库已经存在!不能覆盖','错误',MB_OK MB_ICONERROR);
exit;
end
else
begin
ok:=copyfile(pchar(ExtractFilePath(Application.ExeName) '\tmp\TD_Data_Model.MDB'),pchar(trim(sav.FileName)),True);
if not ok then
showmessage('创建文件失败!')
else
begin
SJKLY:=Trim(sav.FileName); //这里的SJKLY是一个定义数据库链路的全局变量
fn:=ExtractFilePath(Application.ExeName) 'TDXT.INI';
if FileExists(fn) then
begin
try
mIniF:=TIniFile.Create(fn);
mIniF.WriteString('SJKLY', 'SJKLY', SJKLY);
finally
mIniF.Free;
end;
end;
with DM do //DM只一个数据模块
begin
SJK:=True; //此为判断数据库是否打开的变量,是一个全局变量
adoConAcc.Connected:=False;
adoConAcc.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' SJKLY ';Jet OLEDB:Database Password=tdxtsj';
frmMain.Caption:='XXXX数据处理软件' ' ' sjkly;
lstJH.Items.Clear; //lstJH为主窗体中一个TlistVieW类控件
CLValue;
CLRKValue;
end;
end;
end;
end;
end;

[/code]


"生成PC库"选项的代码如下:

[code delphi]
procedure TfrmMain.PC2Click(Sender: TObject);
var fn,tabname:string;
cp_flag:boolean;
revstr,rq1,rq2,strtemp:string;
i:integer;
begin
sav.Filter:='PC数据库文件(*.dbf)|*.dbf';
if sav.Execute then
begin
fn:=Trim(sav.FileName);
if not FileExists(fn) then
begin
cp_flag:=copyfile(pchar(ExtractFilePath(Application.ExeName) '\dbf\csjg.dbf'),pchar(trim(sav.FileName)),True);
if not cp_flag then
begin
showmessage('创建文件失败!');
exit;
end;
end;
if fn<>'' then
begin
dm.adocondbftemp.Connected:=false;
dm.adocondbftemp.ConnectionString:='Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceDB=' ExtractFilePath(fn) ';SourceType=DBF;';
try
dm.adocondbftemp.Connected:=true;
except
showmessage('连接数据库出错!');
exit;
end; ///end try
end; ///end if fn<>''
revstr:=reversestring(fn);
tabname:=copy(reversestring(copy(revstr,1,pos('\',revstr)-1)),1,pos('.',reversestring(copy(revstr,1,pos('\',revstr)-1)))-1);
tabname:=LowerCase(tabname);
strtemp:=copy(tabname,pos('pc',tabname)-6,6);
rq1:=copy(strtemp,1,4) '-' copy(strtemp,5,2) '-' '01';
rq2:=copy(strtemp,1,4) '-' copy(strtemp,5,2) '-' '31';
dm.ADOQuery15.Close;
dm.ADOQuery15.SQL.Text:='delete from ' tabname ' where csrq>{' formatdatetime('mm/dd/yyyy',strtodate(rq2)) '} and csrq<{' formatdatetime('mm/dd/yyyy',strtodate(rq1)) '}';
dm.ADOQuery15.ExecSQL;


DM.adoConBD1.Connected:=False;
DM.adoConBD1.ConnectionString:='Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceDB=' frmMain.SCLJ ';SourceType=DBF;';
with DM.ADOQuery6 do
begin
Close;
SQL.Clear;
SQL.Add('select * from daa01');
Open;
if Recordset.RecordCount<=0 then
begin
Exit;
end
else
begin
while not Eof do
begin
dm.ADOQuery15.Close;
dm.ADOQuery15.SQL.Text:='select * from ' tabname ' where jh=''' fieldbyname('jh').AsString '''';
dm.ADOQuery15.Open;
if dm.ADOQuery15.Eof then
begin
dm.ADOQuery15.Insert;
for i:=0 to dm.ADOQuery15.FieldCount-1 do
begin
if dm.ADOQuery15.Fields[i].FieldName='jh' then
begin
dm.ADOQuery15.FieldByName('jh').AsString:=trim(DM.ADOQuery6.fieldbyname('jh').AsString);
end
else
if dm.ADOQuery15.Fields[i].FieldName='cyfs' then
begin
dm.ADOQuery15.FieldByName('cyfs').AsString:=trim(DM.ADOQuery6.fieldbyname('cyfs').AsString);
end
else
if dm.ADOQuery15.Fields[i].FieldName='csrq' then
begin
dm.ADOQuery15.FieldByName('csrq').Value:=date();
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
end;
{if dm.ADOQuery15.Fields[i].FieldName='cyfs' then
begin
dm.ADOQuery15.FieldByName('cyfs').AsString:=trim(DM.ADOQuery6.fieldbyname('cyfs').AsString);
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
continue;
end;
if dm.ADOQuery15.Fields[i].FieldName='csrq' then
begin
dm.ADOQuery15.FieldByName('csrq').Value:=date();
continue;
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
continue;
end; }
//if dm.ADOQuery15.Fields[i].FieldName='jh' then dm.ADOQuery15.FieldByName('csrq').FieldKind
end;
dm.ADOQuery15.Post;
end;
next;
end;
end;
end;
showmessage('操作完成!');
end;
end;

[/code]

編輯記錄
nadawudi 重新編輯於 2008-12-19 16:42:51, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-19 17:57:23 IP:60.248.xxx.xxx 訂閱
看起來是因為您在 【新建數據庫】 的地方少加了一行程式碼

sav.Filter:='数据库文件(*.mdb)|*.mdb';

把這行加在 if sav.Execute then 的前面
===================引 用 nadawudi 文 章===================
各位好,由于小弟才学编程不久,有一个问题困饶多日,请好心人帮忙解答:(使用的是delphi7)
是这样的我这里有一个控制软件,在主窗口的主目录第一项为"文件配置",点开还有许多子选项,其中有两项分别为"新建数据库"、"生成PC库"
我本来的想法是'新建数据库'选项用来新件mdb格式的库文件,而'生成PC库"选项用来生成dbf格式的库文件.
程序运行是没有什么问题,但是现在遇到一个问题就是,当我直接点"新建数据库"建立的是mdb库,这里还是正常,但是如果我先选则进了"生成PC库'选项,再退出来进"新建数据库'就只能建立dbf库,这个问题困饶我多日,到现在还没有解决,请好心人帮忙解决,谢谢
"新建数据库"选项代码如下:
[code delphi]
procedure TfrmMain.N50Click(Sender:TObject);
var
i:Integer;
ok:boolean;
mIniF:TIniFile;
fn:string;
begin
if sav.Execute then
begin
if FileExists(sav.FileName) then
begin
Application.MessageBox('数据库已经存在!不能覆盖','错误',MB_OK MB_ICONERROR);
exit;
end
else
begin
ok:=copyfile(pchar(ExtractFilePath(Application.ExeName) '\tmp\TD_Data_Model.MDB'),pchar(trim(sav.FileName)),True);
if not ok then
showmessage('创建文件失败!')
else
begin
SJKLY:=Trim(sav.FileName); //这里的SJKLY是一个定义数据库链路的全局变量
fn:=ExtractFilePath(Application.ExeName) 'TDXT.INI';
if FileExists(fn) then
begin
try
mIniF:=TIniFile.Create(fn);
mIniF.WriteString('SJKLY', 'SJKLY', SJKLY);
finally
mIniF.Free;
end;
end;
with DM do //DM只一个数据模块
begin
SJK:=True; //此为判断数据库是否打开的变量,是一个全局变量
adoConAcc.Connected:=False;
adoConAcc.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' SJKLY ';Jet OLEDB:Database Password=tdxtsj';
frmMain.Caption:='XXXX数据处理软件' ' ' sjkly;
lstJH.Items.Clear; //lstJH为主窗体中一个TlistVieW类控件
CLValue;
CLRKValue;
end;
end;
end;
end;
end;

[/code]


"生成PC库"选项的代码如下:

[code delphi]
procedure TfrmMain.PC2Click(Sender: TObject);
var fn,tabname:string;
cp_flag:boolean;
revstr,rq1,rq2,strtemp:string;
i:integer;
begin
sav.Filter:='PC数据库文件(*.dbf)|*.dbf';
if sav.Execute then
begin
fn:=Trim(sav.FileName);
if not FileExists(fn) then
begin
cp_flag:=copyfile(pchar(ExtractFilePath(Application.ExeName) '\dbf\csjg.dbf'),pchar(trim(sav.FileName)),True);
if not cp_flag then
begin
showmessage('创建文件失败!');
exit;
end;
end;
if fn<>'' then
begin
dm.adocondbftemp.Connected:=false;
dm.adocondbftemp.ConnectionString:='Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceDB=' ExtractFilePath(fn) ';SourceType=DBF;';
try
dm.adocondbftemp.Connected:=true;
except
showmessage('连接数据库出错!');
exit;
end; ///end try
end; ///end if fn<>''
revstr:=reversestring(fn);
tabname:=copy(reversestring(copy(revstr,1,pos('\',revstr)-1)),1,pos('.',reversestring(copy(revstr,1,pos('\',revstr)-1)))-1);
tabname:=LowerCase(tabname);
strtemp:=copy(tabname,pos('pc',tabname)-6,6);
rq1:=copy(strtemp,1,4) '-' copy(strtemp,5,2) '-' '01';
rq2:=copy(strtemp,1,4) '-' copy(strtemp,5,2) '-' '31';
dm.ADOQuery15.Close;
dm.ADOQuery15.SQL.Text:='delete from ' tabname ' where csrq>{' formatdatetime('mm/dd/yyyy',strtodate(rq2)) '} and csrq<{' formatdatetime('mm/dd/yyyy',strtodate(rq1)) '}';
dm.ADOQuery15.ExecSQL;


DM.adoConBD1.Connected:=False;
DM.adoConBD1.ConnectionString:='Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceDB=' frmMain.SCLJ ';SourceType=DBF;';
with DM.ADOQuery6 do
begin
Close;
SQL.Clear;
SQL.Add('select * from daa01');
Open;
if Recordset.RecordCount<=0 then
begin
Exit;
end
else
begin
while not Eof do
begin
dm.ADOQuery15.Close;
dm.ADOQuery15.SQL.Text:='select * from ' tabname ' where jh=''' fieldbyname('jh').AsString '''';
dm.ADOQuery15.Open;
if dm.ADOQuery15.Eof then
begin
dm.ADOQuery15.Insert;
for i:=0 to dm.ADOQuery15.FieldCount-1 do
begin
if dm.ADOQuery15.Fields[i].FieldName='jh' then
begin
dm.ADOQuery15.FieldByName('jh').AsString:=trim(DM.ADOQuery6.fieldbyname('jh').AsString);
end
else
if dm.ADOQuery15.Fields[i].FieldName='cyfs' then
begin
dm.ADOQuery15.FieldByName('cyfs').AsString:=trim(DM.ADOQuery6.fieldbyname('cyfs').AsString);
end
else
if dm.ADOQuery15.Fields[i].FieldName='csrq' then
begin
dm.ADOQuery15.FieldByName('csrq').Value:=date();
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
end;
{if dm.ADOQuery15.Fields[i].FieldName='cyfs' then
begin
dm.ADOQuery15.FieldByName('cyfs').AsString:=trim(DM.ADOQuery6.fieldbyname('cyfs').AsString);
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
continue;
end;
if dm.ADOQuery15.Fields[i].FieldName='csrq' then
begin
dm.ADOQuery15.FieldByName('csrq').Value:=date();
continue;
end
else
begin
if dm.ADOQuery15.Fields[i].DataType=ftstring then
dm.ADOQuery15.Fields[i].Value:=' '
else
dm.ADOQuery15.Fields[i].Value:=0;
continue;
end; }
//if dm.ADOQuery15.Fields[i].FieldName='jh' then dm.ADOQuery15.FieldByName('csrq').FieldKind
end;
dm.ADOQuery15.Post;
end;
next;
end;
end;
end;
showmessage('操作完成!');
end;
end;

[/code]

------
價值的展現,來自於你用哪一個角度來看待它!!
nadawudi
一般會員


發表:6
回覆:7
積分:2
註冊:2008-12-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-22 09:20:34 IP:221.200.xxx.xxx 訂閱
问题解决了,原来是差行这个,谢谢.
系統時間:2024-04-23 22:44:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!