请各位大哥帮帮小弟 看看 程序代码有什么问题
小弟主要是实现 对数据库(SQL)的恢复和连接(分单机和网络两种)
但现在有点问题是 在实现网络数据库的连接时候出现问题 单机的可以实现
编程步骤如下
1先启动winsock的动态链接库:利用API函数wsastartup(wversionrequested,wsadata)
2然后利用p:=gethostbyname(pchar('服务器主机名称')):测试该主机是否名对应的服务器是否存在和运行。如果返回值<>Nil 则说明服务器运行
3最后利用API汉说inet_ntoa(pinaddr(p^.h_addr_list^)^)返回主机名对应的IP地址
4通过数据库服务器的Ip地址连接数据库
5将数据库配置信息存放到*.ini配置文件中
整体代码如下
其中TFinifile主要是对INI文件的操作
TZQEdit只是对Edit增加了自动设置输入法
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
以下就是出现问题的代码
/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////procedure TFrm_Restore.BB_ConnectClick(Sender: TObject);
var
wVersionRequested : WORD;
wsaData : TWSAData;
p: PHostEnt;
p2 : pchar;
servername:string;
begin
if Trim(Edt_ServerName.Text) = '' then
begin
if RG_select.ItemIndex=0 then ShowMessage('服务器名不能为空!')
else ShowMessage('计算机名不能为空!');
Edt_ServerName.SetFocus;
Exit;
end; Screen.Cursor := crHourGlass;
if RG_select.ItemIndex=0 then //网络
begin
{连接 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
{获得计算机名}
p := GetHostByName(PChar(Trim(Edt_ServerName.Text)));
if p = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('服务器连接失败!可能是所输入的服务器名有误,请重新输入。');
{断开 WinSock}
WSACleanup;
Exit;
end; {获得本机的ip地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
try servername:=p2;
adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Glasses_L;Data Source='+servername;
adoconnection1.Connected:=true;
// adoq_pro.Active:=true;
except
showmessage('服务器连接失败!请检查数据库连接!');
exit;
end;
INI.Directory:=ExtractFilePath(Application.ExeName);
InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
InI.Writestrings('数据库连接', 'User ID', 'sa');
InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
InI.Writestrings('数据库连接', 'Data Source', p2);
InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
InI.Writestrings('数据库连接', 'Auto Translate', 'True');
InI.Writestrings('数据库连接', 'Packet Size', '4096');
InI.Writestrings('数据库连接', 'Workstation ID', idstack.Gstack.localaddress);
{断开 WinSock}
WSACleanup;
end else
begin //单机系统
INI.Directory:=ExtractFilePath(Application.ExeName);
InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
InI.Writestrings('数据库连接', 'User ID', 'sa');
InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
InI.Writestrings('数据库连接', 'Data Source', '');
InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
InI.Writestrings('数据库连接', 'Auto Translate', 'True');
InI.Writestrings('数据库连接', 'Packet Size', '4096');
InI.Writestrings('数据库连接', 'Workstation ID', trim(Edt_ServerName.Text));
end;
Screen.Cursor := crDefault;
ShowMessage('数据库连接成功!');
// close;
end;
//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
小弟主要是实现 对数据库(SQL)的恢复和连接(分单机和网络两种)
但现在有点问题是 在实现网络数据库的连接时候出现问题 单机的可以实现
编程步骤如下
1先启动winsock的动态链接库:利用API函数wsastartup(wversionrequested,wsadata)
2然后利用p:=gethostbyname(pchar('服务器主机名称')):测试该主机是否名对应的服务器是否存在和运行。如果返回值<>Nil 则说明服务器运行
3最后利用API汉说inet_ntoa(pinaddr(p^.h_addr_list^)^)返回主机名对应的IP地址
4通过数据库服务器的Ip地址连接数据库
5将数据库配置信息存放到*.ini配置文件中
整体代码如下
其中TFinifile主要是对INI文件的操作
TZQEdit只是对Edit增加了自动设置输入法
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
以下就是出现问题的代码
/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////procedure TFrm_Restore.BB_ConnectClick(Sender: TObject);
var
wVersionRequested : WORD;
wsaData : TWSAData;
p: PHostEnt;
p2 : pchar;
servername:string;
begin
if Trim(Edt_ServerName.Text) = '' then
begin
if RG_select.ItemIndex=0 then ShowMessage('服务器名不能为空!')
else ShowMessage('计算机名不能为空!');
Edt_ServerName.SetFocus;
Exit;
end; Screen.Cursor := crHourGlass;
if RG_select.ItemIndex=0 then //网络
begin
{连接 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
{获得计算机名}
p := GetHostByName(PChar(Trim(Edt_ServerName.Text)));
if p = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('服务器连接失败!可能是所输入的服务器名有误,请重新输入。');
{断开 WinSock}
WSACleanup;
Exit;
end; {获得本机的ip地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
try servername:=p2;
adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Glasses_L;Data Source='+servername;
adoconnection1.Connected:=true;
// adoq_pro.Active:=true;
except
showmessage('服务器连接失败!请检查数据库连接!');
exit;
end;
INI.Directory:=ExtractFilePath(Application.ExeName);
InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
InI.Writestrings('数据库连接', 'User ID', 'sa');
InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
InI.Writestrings('数据库连接', 'Data Source', p2);
InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
InI.Writestrings('数据库连接', 'Auto Translate', 'True');
InI.Writestrings('数据库连接', 'Packet Size', '4096');
InI.Writestrings('数据库连接', 'Workstation ID', idstack.Gstack.localaddress);
{断开 WinSock}
WSACleanup;
end else
begin //单机系统
INI.Directory:=ExtractFilePath(Application.ExeName);
InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
InI.Writestrings('数据库连接', 'User ID', 'sa');
InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
InI.Writestrings('数据库连接', 'Data Source', '');
InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
InI.Writestrings('数据库连接', 'Auto Translate', 'True');
InI.Writestrings('数据库连接', 'Packet Size', '4096');
InI.Writestrings('数据库连接', 'Workstation ID', trim(Edt_ServerName.Text));
end;
Screen.Cursor := crDefault;
ShowMessage('数据库连接成功!');
// close;
end;
//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
小弟是第一次写CS的代码 有什么不对的请指教 不需要winsock 那该如何获取服务器的Ip ? 不知道能否详细的说明一下 谢谢了