TADOConnection在连接数据库的时候如果连接不上的问题!怎么解决!(300分)

时间:2021-05-04 04:49:20
TADOConnection在连接数据库的时候如果连接不上,我的软件就会小小的死一会!!!怎么解决!
如果在连接上以后网络突然断了,或者是网络速度不太好的情况下,它的下面的ADOQuery在做连接操作的时候也会小小的死去一会,怎么解决!
如果那位高手知道的话,我可以另外开帖子加分!
帮我,小弟现在苦恼啊!

11 个解决方案

#1


连接远程数据库服务器前,先使用TClientSocket连接端口(测试端口,时间3秒足够),如果TClientSocket连接不上,就不再使用TADOConnection连接了。

使用TClientSocket连接端口时,要使用线程来控制时间,并使用阻塞型连接,线程内时间一到就取消Socket, (如果端口有效,那是一连就通,如数据库服务未开,而服务器存在,也很快被拒绝,而服务器不存在时,可能时间较长,这时TClientSocket将发生作用)。

#2


线程写法:

//---------------------------------------------------------------------------
__fastcall TThreadConnPort::TThreadConnPort(TClientSocket *ClientSocket,
                int TimeOut) : TThread(true)
{
    SocketPoint = ClientSocket;
    MaxTimeOut = TimeOut;
    FreeOnTerminate = true;
    Resume();
}
//---------------------------------------------------------------------------
void __fastcall TThreadConnPort::Execute(void)
{
    int TimeCount = 0;
    Sleep(300);
    while (!Terminated)
    {
        TimeCount++;
        try
        {
            if (SocketPoint->Tag) break;
            else if (TimeCount > MaxTimeOut * 10)
            {
                SocketPoint->Socket->Close();
                SocketPoint->Close();
                break;
            }
        }
        catch (...)
        {
            break;
        }
        Sleep(100);
    }
}
//---------------------------------------------------------------------------

#3


bool __fastcall TMainForm::ConnectionServerPort(AnsiString ServerIp, 
                             int ServerPort, int TimeOut)
{
    bool PortConnected;
    TClientSocket *ClientSocket = new TClientSocket(this);
    ClientSocket->Tag = 0;
    ClientSocket->OnConnect = ClientSocketConnect;  //  连接成功时,将Tag置1表示成功
    ClientSocket->OnError = ClientSocketError; //  连接异常时处理函数
    ClientSocket->Host = ServerIp;
    ClientSocket->Port = ServerPort;
    ClientSocket->ClientType = ctBlocking;
    TThreadConnPort * CheckSocket = new TThreadConnPort(ClientSocket, TimeOut);
    try
    {
        ClientSocket->Open();
        CheckSocket->Terminate();
    }
    catch (...)
    {
        ClientSocket->Tag=0;
    }
    PortConnected = ClientSocket->Tag == 1;  //  查询是否成功
    delete ClientSocket;
    return PortConnected;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocketConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    TClientSocket *SocketId = (TClientSocket *)Sender;
    SocketId->Tag = 1;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocketError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    TClientSocket *SocketId = (TClientSocket *)Sender;
    if (ErrorEvent == eeLookup) SocketId->Tag = 2;
    else SocketId->Tag = 3;
    ErrorCode = 0;
}
//---------------------------------------------------------------------------


//  在连接数据库前使用 ConnectionServerPort() 函数测试端口
// 由于连接时,可能使用客户端工具生成的连接名,那么,要进行地址解释。

#4


up

#5


具体出现什么问题,你可以在ODBC中进行配置,多数就不会有问题了
或者用BDE进行配置,然后取其配置文件就可以了
当然用动态联接的方法也可以,这时的关键是数据库文件的路径,我想你应该明白我的意思

#6


1、用多线程
2、ado有超时时间的设置吧,设置一下看看如何

#7


WorkDir=ExtractFileDir(ParamStr(0));
DBString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+WorkDir+"\\hhh.mdb;Persist Security Info=False";

Table_Camera->ConnectionString=DBString;
Table_Camera->TableName="hua";
Table_Camera->Open();

#8


用超时设置

#9


学习

#10


谢谢各位 
 sczyq和我想的方法一样,而且我已经用了这个方法,但是我以为有更好的方法,
不过我的方法和他的稍微有一点不同,
我是在连接出错以后在测试连接,并重新连接的,不过思路大体一样,给分了!!!

#11


请sczyq到新帖子领分 
 

#1


连接远程数据库服务器前,先使用TClientSocket连接端口(测试端口,时间3秒足够),如果TClientSocket连接不上,就不再使用TADOConnection连接了。

使用TClientSocket连接端口时,要使用线程来控制时间,并使用阻塞型连接,线程内时间一到就取消Socket, (如果端口有效,那是一连就通,如数据库服务未开,而服务器存在,也很快被拒绝,而服务器不存在时,可能时间较长,这时TClientSocket将发生作用)。

#2


线程写法:

//---------------------------------------------------------------------------
__fastcall TThreadConnPort::TThreadConnPort(TClientSocket *ClientSocket,
                int TimeOut) : TThread(true)
{
    SocketPoint = ClientSocket;
    MaxTimeOut = TimeOut;
    FreeOnTerminate = true;
    Resume();
}
//---------------------------------------------------------------------------
void __fastcall TThreadConnPort::Execute(void)
{
    int TimeCount = 0;
    Sleep(300);
    while (!Terminated)
    {
        TimeCount++;
        try
        {
            if (SocketPoint->Tag) break;
            else if (TimeCount > MaxTimeOut * 10)
            {
                SocketPoint->Socket->Close();
                SocketPoint->Close();
                break;
            }
        }
        catch (...)
        {
            break;
        }
        Sleep(100);
    }
}
//---------------------------------------------------------------------------

#3


bool __fastcall TMainForm::ConnectionServerPort(AnsiString ServerIp, 
                             int ServerPort, int TimeOut)
{
    bool PortConnected;
    TClientSocket *ClientSocket = new TClientSocket(this);
    ClientSocket->Tag = 0;
    ClientSocket->OnConnect = ClientSocketConnect;  //  连接成功时,将Tag置1表示成功
    ClientSocket->OnError = ClientSocketError; //  连接异常时处理函数
    ClientSocket->Host = ServerIp;
    ClientSocket->Port = ServerPort;
    ClientSocket->ClientType = ctBlocking;
    TThreadConnPort * CheckSocket = new TThreadConnPort(ClientSocket, TimeOut);
    try
    {
        ClientSocket->Open();
        CheckSocket->Terminate();
    }
    catch (...)
    {
        ClientSocket->Tag=0;
    }
    PortConnected = ClientSocket->Tag == 1;  //  查询是否成功
    delete ClientSocket;
    return PortConnected;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocketConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    TClientSocket *SocketId = (TClientSocket *)Sender;
    SocketId->Tag = 1;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocketError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    TClientSocket *SocketId = (TClientSocket *)Sender;
    if (ErrorEvent == eeLookup) SocketId->Tag = 2;
    else SocketId->Tag = 3;
    ErrorCode = 0;
}
//---------------------------------------------------------------------------


//  在连接数据库前使用 ConnectionServerPort() 函数测试端口
// 由于连接时,可能使用客户端工具生成的连接名,那么,要进行地址解释。

#4


up

#5


具体出现什么问题,你可以在ODBC中进行配置,多数就不会有问题了
或者用BDE进行配置,然后取其配置文件就可以了
当然用动态联接的方法也可以,这时的关键是数据库文件的路径,我想你应该明白我的意思

#6


1、用多线程
2、ado有超时时间的设置吧,设置一下看看如何

#7


WorkDir=ExtractFileDir(ParamStr(0));
DBString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+WorkDir+"\\hhh.mdb;Persist Security Info=False";

Table_Camera->ConnectionString=DBString;
Table_Camera->TableName="hua";
Table_Camera->Open();

#8


用超时设置

#9


学习

#10


谢谢各位 
 sczyq和我想的方法一样,而且我已经用了这个方法,但是我以为有更好的方法,
不过我的方法和他的稍微有一点不同,
我是在连接出错以后在测试连接,并重新连接的,不过思路大体一样,给分了!!!

#11


请sczyq到新帖子领分