由于没有怎么写数据库应用,有个简单问题要问专家:
想连接服务器上的数据库,由于服务器的IP地址可能改变,或换别的服务器,为避免联接数据不成功,允许客户重新输入改变后的IP地址,同时用一个文本文件记录下用户重新填写的IP地址以备下次联接用,再联接数据库:代码如下(联接数据库的代码省略了,只贴出连接不成功后的代码):procedure TDataModule9.ADOConnection1ConnectComplete(
Connection: TADOConnection; const Error: Error;
var EventStatus: TEventStatus);
var
ls_currdir:String;
Str,ipaddr:TStringList;
Reg:TRegistry;
begin
if EventStatus=esErrorsOccured then //如果连接发生问题(一般是IP地址不正确或服务器没启动)
begin
// ShowMessage('错误:数据库连接失败。请启动数据库服务后再运行本系统!');
ipaddr:=InputBox('手动输入IP地址','没有找到数据库服务器,请确定其IP地址:','192.168.1.1');
ls_currdir:=GetCurrentDir;
Str:=TStringList.Create;
Str[0]:=ipaddr;
showmessage(str[0]);
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
FreeAndNil(Str);
//以上代码不知何故没有执行
Reg:=TRegistry.Create;
Reg.RootKey:=LongWord($80000002);
Reg.OpenKey('Software\ODBC\ODBC.INI\Czjdoc',true);
Reg.WriteString('CommLinks','TCPIP{host='+ipaddr+'}');//重写连接参数
Reg.CloseKey;
Reg.Free;
ADOConnection1.Open();
if Not ADOConnection1.Connected then application.Terminate;
end;
end;
奇怪的是,在注册表中重写连接参数后数据库可正常连接,但 FreeAndNil(Str)这一句以上的代码却没有执行,导致不能记录用户填写的IP地址。
是不是这些代码不应该写在ADOConnection1ConnectComplete中?
类似问题还有没有其他解决办法?
想连接服务器上的数据库,由于服务器的IP地址可能改变,或换别的服务器,为避免联接数据不成功,允许客户重新输入改变后的IP地址,同时用一个文本文件记录下用户重新填写的IP地址以备下次联接用,再联接数据库:代码如下(联接数据库的代码省略了,只贴出连接不成功后的代码):procedure TDataModule9.ADOConnection1ConnectComplete(
Connection: TADOConnection; const Error: Error;
var EventStatus: TEventStatus);
var
ls_currdir:String;
Str,ipaddr:TStringList;
Reg:TRegistry;
begin
if EventStatus=esErrorsOccured then //如果连接发生问题(一般是IP地址不正确或服务器没启动)
begin
// ShowMessage('错误:数据库连接失败。请启动数据库服务后再运行本系统!');
ipaddr:=InputBox('手动输入IP地址','没有找到数据库服务器,请确定其IP地址:','192.168.1.1');
ls_currdir:=GetCurrentDir;
Str:=TStringList.Create;
Str[0]:=ipaddr;
showmessage(str[0]);
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
FreeAndNil(Str);
//以上代码不知何故没有执行
Reg:=TRegistry.Create;
Reg.RootKey:=LongWord($80000002);
Reg.OpenKey('Software\ODBC\ODBC.INI\Czjdoc',true);
Reg.WriteString('CommLinks','TCPIP{host='+ipaddr+'}');//重写连接参数
Reg.CloseKey;
Reg.Free;
ADOConnection1.Open();
if Not ADOConnection1.Connected then application.Terminate;
end;
end;
奇怪的是,在注册表中重写连接参数后数据库可正常连接,但 FreeAndNil(Str)这一句以上的代码却没有执行,导致不能记录用户填写的IP地址。
是不是这些代码不应该写在ADOConnection1ConnectComplete中?
类似问题还有没有其他解决办法?
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
FreeAndNil(Str);
begin
ipaddr:=InputBox('手动输入IP地址','没有找到数据库服务器,请确定其IP地址:','192.168.1.1');
ls_currdir:=GetCurrentDir;
Str:=TStringList.Create;
Str[0]:=ipaddr; /////////////////這一句有問題。 //
showmessage(str[0]);
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
FreeAndNil(Str);
//以上代码不知何故没有执行改為:Str[0]:=ipaddr; == > Str.Append(ipAddr);
建立一個空的STR,你訪問索引號出錯了。
var
ls_currdir,ipaddr:String;
Str:TStringList;
Reg:TRegistry;代码编译没问题,注册表也改写了,就是
ls_currdir:=GetCurrentDir;
Str:=TStringList.Create;
Str[0]:=ipaddr;
ShowMessage(str[0]); //连这句都没执行
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
FreeAndNil(Str);
这些代码不知何故没有执行,但改写注册表的代码却执行了。
由于EventStatus=esErrorsOccured
说明连接发生问题,客户端ODBC程序会触发一个数据库底层联接错误提示,感觉可能就是这个错误影响了这些代码的执行。
怎样屏蔽数据库的低层错误信息?
要使用str.add(ipaddr);
Str[0]:=ipaddr; //这里有问题,Str刚刚创建,访问Str[0]肯定会出错,出错后跳出程序,所以没有执行后面的代码
try
Str.add(ipaddr)
ShowMessage(str[0]); //连这句都没执行
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
finally
FreeAndNil(Str);
end;
strList.items.add(str);类似的.
try
Str.add(ipaddr)
ShowMessage(str[0]); //连这句都没执行
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
finally
FreeAndNil(Str);
end;
try
Str.add(ipaddr)
ShowMessage(str[0]); //连这句都没执行
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
finally
FreeAndNil(Str);
end;
try
Str.add(ipaddr)
ShowMessage(str[0]); //连这句都没执行
Str.SaveToFile(ls_currdir+'\IpAddr.txt');
finally
FreeAndNil(Str);
end;
结帐