请教程序发布时数据库的问题(10分)

  • 主题发起人 主题发起人 cjf1009
  • 开始时间 开始时间
C

cjf1009

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序做完了!
数据库是access,用adoconnection连的,属性是:
Provider=Microsoft.Jet.OLEDB.4.0;
连接我直接写的数据库的名称:ehaopai.mdb。测试成功了。
别的与数据库有关的也都用的ado。
用Wise Installation System做安装程序,编译成功了,可安装程序安上之后总不能运行。提示:找不到文件c;/ehaopai.mdb为什么?
如果我连接那里把数据库的路径写进去:F:/ehaopai/ehaopai.mdb
就会提示:找不到文件F:/ehaopai/ehaopai.mdb。
我是学这个例子做的:http://www.nssoft.net/showdoc.asp?did=805
为什么他的能成功?我觉得还是数据库连接的问题,照他那样应该怎么连?
真诚想高手请教!
 
来自:cjf1009, 时间:2004-2-3 9:39:00, ID:2432814
做的这么好,我真是惭愧啊!
楼主,能告诉我你的安装程序是怎么做的吗?我的程序用access数据库,ado连的,用wise做安装程序,可怎么也做不好,请帮帮忙啊!http://delphibbs.com/delphibbs/dispq.asp?lid=2431965
 
来自:cjf1009, 时间:2004-2-3 9:39:00, ID:2432814
做的这么好,我真是惭愧啊!
楼主,能告诉我你的安装程序是怎么做的吗?我的程序用access数据库,ado连的,用wise做安装程序,可怎么也做不好,请帮帮忙啊!http://delphibbs.com/delphibbs/dispq.asp?lid=2431965
我想,你的程序可做成动态连接数据库,给你一段“房屋安全鉴定管理系统”的源代码如下,sDatabaseFileName可从OpenFileDialog中取得:
function TFrmChildWin.ConnectDatabaseForOpen(sDataBaseFileName: String):Boolean;
begin
if ADOConMain.Connected then
ADOConMain.Close;
ADOConMain.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
ADOConMain.LoginPrompt:= false;
ADOQueMain.Close;
ADOQueMain.Connection:= ADOConMain;
ADOQueCalcu.Connection:= ADOConMain;
//ADOQueMain[MainForm.ActiveMDIChild.Tag].ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
//ADOQueMain[MainForm.ActiveMDIChild.Tag].Active:= true;
if ADOConMain.Connected then
Result:=true
else
Result:=false;
end;
 
如果数据库位置固定在主程序的文件夹下,可采取如下的方法:
sMainDir:= ExtractFileDir(Application.ExeName);
//取得主程序的路径
sDatabaseFileName := sMainDir+'/ehaopai.mdb';
ConnectDatabaseForOpen(sDataBaseFileName);

 
if ADOConMain = nil then
begin
//MessageBox(handle,PChar(IntToStr(i)), szProgramTitle, MB_OK+MB_ICONERROR);
ADOConMain := TADOConnection.Create(Self);
ADOQueMain := TADOQuery.Create(Self);
ADOQueCalcu := TADOQuery.Create(Self);
end;

procedure TfrmChildWin.FormDestroy(Sender: TObject);
begin
ADOQueMain.Close;
ADOQueMain.Free;
ADOQueMain := nil;
ADOQueCalcu.Close;
ADOQueCalcu.Free;
ADOQueCalcu := nil;
ADOConMain.Close;
ADOConMain.Free;
ADOConMain := nil;
end;
 
在程序中,连接的文件名写成这样。(写代码,不要直接写在控件中)
ExtractFilePath(Application.Exename)+'ehaopai.mdb'
 
ChaseSun, 非常感谢。可是,我的还是不行啊!
我把adoconnect放在了一个DataModule里,这样写的:
procedure TTdmmain.DataModuleCreate(Sender: TObject);
var
smaindir,sDatabaseFileName : String;
begin
sMainDir:= ExtractFileDir(Application.ExeName);
//取得主程序的路径
sDatabaseFileName := sMainDir+'/ecard.mdb';
ConnectDatabaseForOpen(sDataBaseFileName);
end;
提示:application和exename那里有错误,为什么?
 
ChaseSun,终于碰见一个可详细给我这种初学者回答问题的大侠了!!!我在请教一个问题,问了好久也没人回答我的,不知道是不是太难了;)
sql:='Select * Into [Text;Database='+fp+'].'+fn+' from carinfo where cardate>='+adate1+' and cardate<='+adate2+' and zhuitao="是"';
Tdmmain.ADOConn1.Execute(sql);
为什么我导出的记录是0条?符合条件的记录是两条的!就是时间这里的问题,把时间条件去了,就可以导出符合条件的两条数据了。
查询语句:
with adoquery1do
begin
close;
sql.Clear;
sql.Add('select * from carinfo where cardate>=:cardate1 and cardate<=:cardate2 and zhuitao=:zhuitao');
parameters.ParamValues['cardate1']:=adate1;
parameters.ParamValues['cardate2']:=adate2;
parameters.ParamValues['zhuitao']:='是';
open;
多谢了!!
 
你要将下面的程序的ADOConMain、ADOQueMain改成放在了一个DataModule的adoconnect和ADOQuery。
function TFrmChildWin.ConnectDatabaseForOpen(sDataBaseFileName: String):Boolean;
begin
if ADOConMain.Connected then
ADOConMain.Close;
ADOConMain.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
ADOConMain.LoginPrompt:= false;
ADOQueMain.Close;
ADOQueMain.Connection:= ADOConMain;
ADOQueCalcu.Connection:= ADOConMain;
//ADOQueMain[MainForm.ActiveMDIChild.Tag].ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
//ADOQueMain[MainForm.ActiveMDIChild.Tag].Active:= true;
if ADOConMain.Connected then
Result:=true
else
Result:=false;
end;

变更如下:
function TDataModule.ConnectDatabaseForOpen(sDataBaseFileName: String):Boolean;
begin
if adoconnect.Connected then
adoconnect.Close;
ADOadoconnect.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
adoconnect.LoginPrompt:= false;
ADOQuery.Close;
ADOQuery.Connection:= adoconnect;
if adoconnect.Connected then
Result:=true
else
Result:=false;
end;
 
日期格式改成yyyy.mm.dd试试,如下:
with adoquery1do
begin
close;
sql.Clear;
sql.Add('select * from carinfo where cardate>=:cardate1 and cardate<=:cardate2 and zhuitao=:zhuitao');
parameters.ParamValues['cardate1']:=FormatDateTime('yyyy.mm.dd',adate1);
parameters.ParamValues['cardate2']:=FormatDateTime('yyyy.mm.dd',adate2);
parameters.ParamValues['zhuitao']:='是';
open;
 
真是太太太感谢了,我终于实验成功了。我都快放弃了;(
我在那个数据模块了写没写成功,就把adoconnection的连接属性给删了,在另一个模块里写的,因为在数据模块里老是出错,ExtractFilePath、Application、ExeName都用不了,procedure TfrmMain.FormCreate(Sender: TObject);
begin
sDataBaseFileName:= ExtractFilePath(Application.ExeName)+'/ecard.mdb';
tdmmain.ADOConn1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDataBaseFileName +';Mode=Read|Write;Persist Security Info=False';
tdmmain.adoconn1.LoginPrompt:= false;
end;
现在终于运行通过了;)真的很感谢你。就是还没编译呢,不知道这次做的安装程序能不能用了。对了,能把你的信箱或qq留一下吗?
至于第二个问题,还是不行,提示数据类型不匹配,我的数据库里是yyyy-mm-dd的。
 
我试验了一下,如下可查询日期类型:
adoqueMain.SQL.Add('select * from ProjectTab where ApprDate>=:cardate1 and ApprDate<=:cardate2');
adoqueMain.parameters.ParamByName('cardate1').value:=FormatDatetime('mm"/"dd"/"yy',strtodate('1979-9-9'));
adoqueMain.parameters.ParamByName('cardate2').value:=FormatDatetime('mm"/"dd"/"yy',strtodate('2006-9-9'));
我的Email: cmzou@21cn.com,没有QQ,有空多聊!
 
ChaseSun:谢谢!可能你把问题看错了吧,我的查询没问题,只是导出的时候不正确。我新开的贴,欢迎光临。
http://delphibbs.com/delphibbs/dispq.asp?lid=2434229
 
接受答案了.
 
后退
顶部