一个关于建立数据库的问题 |
答題得分者是:careychen
|
nadawudi
一般會員 發表:6 回覆:7 積分:2 註冊:2008-12-01 發送簡訊給我 |
各位好,由于小弟才学编程不久,有一个问题困饶多日,请好心人帮忙解答:(使用的是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 發送簡訊給我 |
看起來是因為您在 【新建數據庫】 的地方少加了一行程式碼
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |