📄 testcon.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 + -