⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testcon.cpp

📁 通过线程中检查数据库连接来自动连接数据库。链路检测
💻 CPP
字号:
// testcon.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace  rename("EOF","adoEOF") rename("BOF","adoBOF")



/*
 编译不通过,link2001报beginthreadex 错误的话,打开set 页设置为多线程模式.
*/

#define sConnStr "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;PassWord=mjt_0755;Initial Catalog=GQBD;Data Source=.;"


DWORD WINAPI ActiveConn(LPVOID lp);
DWORD WINAPI TestSQL(LPVOID lp);


void PrintProviderError(_ConnectionPtr   pConnection);
void PrintComError(_com_error &e);

BOOL g_isConnected ;
CString g_sConnStr = "";
_ConnectionPtr g_appConn = NULL;   

int main(int argc, char* argv[])
{
	CoInitialize(NULL);	
	g_sConnStr = sConnStr;
	
	g_appConn.CreateInstance(_T("ADODB.Connection"));	
	try
	{	
		g_appConn->Open(_bstr_t(g_sConnStr), _bstr_t(""), _bstr_t(""),adModeUnknown);
		printf("connect databas success....\r\n");
	}
	catch(_com_error &e)
	{
		printf("connect failur,please check connect string \r\n");
		getchar();
		CoUninitialize();
		return 0;
	}	
	
	printf("start thread to active conn..............\r\n");
	g_isConnected = true;
	
	DWORD lpThreadId;	
	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ActiveConn, NULL, 0, &lpThreadId);	
	
	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestSQL, NULL, 0, &lpThreadId);	
	

	getchar();

	CoUninitialize();	
	return 0;
}


/*
  数据库sql 测试
*/
DWORD WINAPI TestSQL(LPVOID lp)
{
	_ConnectionPtr pConn = NULL;
	pConn.Attach(g_appConn, false);
	
	_RecordsetPtr pRs = NULL;	
	pRs.CreateInstance(__uuidof(Recordset));
	
	
	CString sql = "select * from t_initsm";   //俺的数据库,自己自己测试的库吧。
	while(1)
	{
		try
		{
			if (g_isConnected)
			{
				if(pRs->State == adStateOpen)
					pRs->Close();
				pRs->Open(_bstr_t(sql), _variant_t((IDispatch*)pConn, true), adOpenStatic, adLockReadOnly, adCmdText);
								
				printf(".......test sql select ...\r\n");
			}
		}
		catch(_com_error& e)
		{				
			PrintComError(e);   
			//break;
		}
		Sleep(100);
	}
	return 0;
}

DWORD WINAPI  ActiveConn(LPVOID lp)
{
	_ConnectionPtr pConn = NULL;
	pConn.Attach(g_appConn, false);
	
	_RecordsetPtr pRs = NULL;	
	pRs.CreateInstance(__uuidof(Recordset));
	for(;;) 
	{
		try 
		{
			if(g_isConnected)
			{
				pRs->Open(_bstr_t("select 1"), _variant_t((IDispatch*)pConn, true), adOpenStatic, adLockReadOnly, adCmdText);
				if (pRs)
					if (pRs->State == adStateOpen)
						pRs->Close();
					printf(".......connection ok...\r\n");
			} 
			else 
			{ 
				if (pConn) 
					if(pConn->State == adStateOpen) 
                        pConn->Close(); 
					pConn->Open(_bstr_t(g_sConnStr),_bstr_t(""),_bstr_t(""),adModeUnknown);   //重新打开连接
					g_isConnected = TRUE; 
			} 
		} 
		catch(_com_error &e) 
		{ 
			_variant_t vtConnect = (_variant_t)(pConn.GetInterfacePtr());
			//没有open时返回字符串,否则返回connection 对象			
			//_variant_t vtConnect = pRs->GetActiveConnection();              
			switch(vtConnect.vt) 
			{ 
			case VT_BSTR: 
				printf("...............connect failure1 \r\n");
				PrintComError(e);     
				break; 
			case VT_DISPATCH: 
				printf("...............connect failure2 \r\n");
				PrintProviderError(vtConnect); 
				break; 
			default: 
				printf( "Errors   occured. "); 
				break; 
			} 
			g_isConnected = FALSE; 
		} 
		
		Sleep(100); 
	} 
}




/*
抛出异常消息,第1次抛出

  Error   number:   80004005
  [DBNETLIB][ConnectionWrite (WrapperWrite()).]一般性网络错误。请检查网络文档。
  SQLState   :   08S0 
  NativeError   :   b
  
	抛出异常消息,第2次抛出
	当pConn在Close,重新Open连接会发生异常,此异常是重新连接时抛出的。此时可判断为到远程服务器的连接完全中断 
	Error   number:   80004005
	[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问。
	SQLState   :   08001
	NativeError   :   11
*/
void PrintProviderError(_ConnectionPtr   pConnection) 
{ 
	ErrorPtr     pErr     =   NULL; 
	if((pConnection->Errors->Count) > 0) 
	{ 
		long   nCount = pConnection-> Errors-> Count; 
		for(long i = 0;i<nCount;i++) 
		{ 
			pErr   =   pConnection->Errors->GetItem(i); 
			TRACE( "Error   number:   %x\n%s\n ",   pErr-> Number,  (LPCSTR)pErr-> Description); 
			TRACE( "SQLState   :   %s\n ",   (LPCTSTR)pErr-> SQLState); 
			TRACE( "NativeError   :   %x\n ",   pErr-> NativeError); 
		} 
	} 
} 


void   PrintComError(_com_error &e) 
{ 
    _bstr_t   bstrSource(e.Source()); 
	_bstr_t   bstrDescription(e.Description()); 

    TRACE("Error\n "); 
    TRACE("\tCode   =   %08lx\n ",e.Error()); 
    TRACE("\tCode   meaning   =   %s\n ", e.ErrorMessage()); 
    TRACE("\tSource   =   %s\n ",   (LPCSTR)bstrSource); 
    TRACE("\tDescription   =   %s\n ",(LPCSTR)bstrDescription); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -