#include <windows.h>
#include <sqlext.h>
#include <sql.h>
#include <cstdio>
#include <thread>


class SQLConnection
{
	SQLHANDLE henv;
	SQLHANDLE hdbc;
	SQLHANDLE hstmt;
public:
	void InitConnection()
	{
		unsigned int cbCnxOut = 0;
		wchar_t szCnxOut[512] = {};

		int ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
		ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_UINTEGER);
		ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

		const wchar_t connection_string[] = L"DRIVER={ODBC Driver 17 for SQL Server};NETWORK=dbmssocn;SERVER=SQL1;UID=sa;PWD=Pwd";
//		const wchar_t connection_string[] = L"DRIVER={ODBC Driver 13 for SQL Server};NETWORK=dbmssocn;SERVER=SQL1;UID=sa;PWD=Pwd";

		ret = SQLDriverConnect(hdbc, NULL, (SQLWCHAR*)connection_string, SQL_NTS,
			(SQLWCHAR*)szCnxOut, _countof(szCnxOut), (SHORT*)&cbCnxOut, SQL_DRIVER_NOPROMPT);
	}

	void CloseConnection()
	{
		SQLDisconnect(hdbc);
		SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
		SQLFreeHandle(SQL_HANDLE_ENV, henv);
	}
};

class SQLThread
{
	int exit_signal = 0;
	std::thread th;

public:
	SQLThread() : th(&SQLThread::Process, this)
	{
	}
	void Process()
	{
		SQLConnection conn;

		conn.InitConnection();

		while (!exit_signal)
			Sleep(100);

		conn.CloseConnection();
	}

	~SQLThread()
	{
		exit_signal = 1;
		th.join();
	}

} theThread;


int main()
{
	Sleep(3000);
	return 0;
}
