VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

news2025/1/17 2:54:56

VC 编程开发中的 封装类 :日志类 和SQL server 操作类 源代码

在这里插入图片描述

在VC(Visual C++)开发中,日志文件输出是一个至关重要的环节,它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开发中的介绍和其重要性的详细阐述:

日志文件输出的介绍

  1. 实现方式:在VC开发中,通常通过包含特定的头文件(如logfile.h)并调用相应的日志函数来实现日志的输出。这些函数能够将关键信息记录到指定的日志文件中。
  2. 兼容性:现代的日志输出工具通常具有良好的兼容性,能够支持不同版本的VC,如VC6、VC7(VS系列,包括VS2008)等,从而确保在不同开发环境下的一致性和可用性。
  3. 功能特性:高级的日志输出工具还支持源代码文件名及行号的输出,以及多线程应用。这使得开发人员能够更准确地定位问题来源,特别是在复杂的多线程环境中。

日志文件输出的重要性

  1. 问题定位与排查:日志文件是排查程序问题的主要工具。通过在关键位置打印日志,开发人员可以追踪程序的执行路径和数据状态,从而快速定位并解决问题。这在软件开发和测试阶段尤为重要。
  2. 系统监控与预警:在生产环境中,日志文件可以用于监控系统的运行状态和性能。通过分析日志文件,可以及时发现潜在的问题或异常,以便进行预警和干预,确保系统的稳定性和可靠性。
  3. 优化与改进:日志文件还可以提供关于系统使用情况和性能瓶颈的宝贵信息。开发人员可以利用这些信息对程序进行优化和改进,提高系统的整体性能和用户体验。
  4. 记录与审计:对于需要满足特定安全性或合规性要求的应用系统,日志文件可以作为重要的记录和审计工具。它可以记录用户的操作行为、数据变更等关键信息,以满足法律法规或行业标准的要求。
****************************************************************************
****************************************************************************
//功能:MFC输出日志
//使用说明:
//1.添加引用LOG.h和LOG.cpp文件
//2.需要输出日志时用以下代码:

//LOG::D("调试%s","用法类似printf");
//LOG::I("信息");
//LOG::W("警告");
//LOG::E("错误");

//3.需要删除日志是用以下代码:

//LOG::DeleteLog();

//其中,在LOG.h中的  LOGSAVEDAYS   为日志保存天数;
****************************************************************************
****************************************************************************

#define LOGLEVELDEBUG 1
#define LOGLEVELINFO 2
#define LOGLEVELWARN 3
#define LOGLEVELERROR 4

#define LOGSAVEDAYS 10				//日志保存天数
//
#pragma once

class LOG
{
public:

	//获取应用程序所在路径  创建log文件夹  获取log文件夹路径
	static CString CreatLogFolder();

	获取日志文件名
	static CString GetLogFileName();

	//获取当前时间
	static CString GetNowTime();

	将日志写进log文件
	static BOOL WriteLog(INT LOGLEVEL, CString m_strLogText);
	调试日志
	static BOOL D(CString m_strLogText, ...);
	信息日志
	static BOOL I(CString m_strLogText, ...);
	警告日志
	static BOOL W(CString m_strLogText, ...);
	错误日志
	static BOOL E(CString m_strLogText, ...);

	//删除过期日志文件
	static void DeleteLog();
};


****************************************************************************
****************************************************************************
//功能:MFC输出日志
//使用说明:
//1.添加引用LOG.h和LOG.cpp文件
//2.需要输出日志时用以下代码:

//LOG::D("调试");
//LOG::I("信息");
//LOG::W("警告");
//LOG::E("错误");

//3.需要删除日志是用以下代码:

//LOG::DeleteLog();

//其中,在LOG.h中的  LOGSAVEDAYS   为日志保存天数;
****************************************************************************
****************************************************************************

#include "stdafx.h"
#include "LOG.h"

//获取应用程序所在路径  创建log文件夹  获取log文件夹路径
CString LOG::CreatLogFolder()
{
	CString m_strFilePath;
	GetModuleFileName(NULL, m_strFilePath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
	m_strFilePath.ReleaseBuffer();
	int m_iPosIndex = m_strFilePath.ReverseFind('\\');
	m_strFilePath = m_strFilePath.Left(m_iPosIndex) + "\\Log";
	CFileFind m_FileFind;
	if (!m_FileFind.FindFile(m_strFilePath))
		CreateDirectory(m_strFilePath, NULL);

	return m_strFilePath;
}


//获取日志文件名
CString LOG::GetLogFileName()
{
	CString m_strFileName;
	m_strFileName = CTime::GetCurrentTime().Format("%Y-%m-%d") + ".log";
	return m_strFileName;
}

//获取当前时间
CString LOG::GetNowTime()
{
	SYSTEMTIME st;
	CString m_strTime;
	GetLocalTime(&st);
	m_strTime.Format("%04d-%02d-%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
	return m_strTime;
}

将日志写进log文件
BOOL LOG::WriteLog(INT LOGLEVEL, CString m_strLogText)
{
	try
	{
		//获取应用程序所在路径  创建log文件夹  获取log文件夹路径
		CString m_sLogFolderPath = CreatLogFolder();
		//获取日志文件名
		CString m_sLogFileName = GetLogFileName();
		/日志文件路径
		CString m_sLogFilePath = m_sLogFolderPath + "\\" + m_sLogFileName;
		文件操作
		CStdioFile m_SFile;
		if (!m_SFile.Open(m_sLogFilePath, CFile::modeReadWrite))
		{
			m_SFile.Open(m_sLogFilePath, CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
		}

		/获取当前时间
		CString m_strTime = GetNowTime();
		//日志 时间   ++   等级  ++ 内容
		CString m_sErrorMessage;
		日志---时间
		m_sErrorMessage = "[" + m_strTime + "] ";
		日志----等级
		switch (LOGLEVEL)
		{
		case LOGLEVELDEBUG:
			m_sErrorMessage += "[ DEBUG ] ";
			break;
		case LOGLEVELINFO:
			m_sErrorMessage += "[ INFO  ] ";
			break;
		case LOGLEVELWARN:
			m_sErrorMessage += "[ WARN ] ";
			break;
		case LOGLEVELERROR:
			m_sErrorMessage += "[ ERROR ] ";
			break;
		}
		日志----内容
		m_sErrorMessage += m_strLogText + "\r\n";
		//写日志文件
		m_SFile.SeekToEnd();
		char* m_szMessage;
		m_szMessage = (LPTSTR)(LPCTSTR)m_sErrorMessage;
		m_SFile.Write(m_szMessage, lstrlen(m_szMessage));
		m_SFile.Close();
	}
	catch (CFileException fileException)
	{
		return false;
	}
	return true;
}

调试日志
BOOL LOG::D(CString m_strLogText, ...)
{
	char str_tmp[2048];
	va_list vArgList;                            //定义一个va_list型的变量,这个变量是指向参数的指针.
	va_start(vArgList, m_strLogText);                 //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
	_vsnprintf_s(str_tmp, 2048, m_strLogText, vArgList); //注意,不要漏掉前面的_
	va_end(vArgList);                            //用va_end宏结束可变参数的获取

	BOOL m_bwritelog = WriteLog(LOGLEVELDEBUG, str_tmp);
	return m_bwritelog;
}

信息日志
BOOL LOG::I(CString m_strLogText, ...)
{
	char str_tmp[2048];
	va_list vArgList;                            //定义一个va_list型的变量,这个变量是指向参数的指针.
	va_start(vArgList, m_strLogText);                 //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
	_vsnprintf_s(str_tmp, 2048, m_strLogText, vArgList); //注意,不要漏掉前面的_
	va_end(vArgList);                            //用va_end宏结束可变参数的获取

	BOOL m_bwritelog = WriteLog(LOGLEVELINFO, str_tmp);
	return m_bwritelog;
}

警告日志
BOOL LOG::W(CString m_strLogText, ...)
{
	char str_tmp[2048];
	va_list vArgList;                            //定义一个va_list型的变量,这个变量是指向参数的指针.
	va_start(vArgList, m_strLogText);                 //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
	_vsnprintf_s(str_tmp, 2048, m_strLogText, vArgList); //注意,不要漏掉前面的_
	va_end(vArgList);                            //用va_end宏结束可变参数的获取

	BOOL m_bwritelog = WriteLog(LOGLEVELWARN, str_tmp);
	return m_bwritelog;
}

错误日志
BOOL LOG::E(CString m_strLogText, ...)
{
	char str_tmp[2048];
	va_list vArgList;                            //定义一个va_list型的变量,这个变量是指向参数的指针.
	va_start(vArgList, m_strLogText);                 //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
	_vsnprintf_s(str_tmp, 2048, m_strLogText, vArgList); //注意,不要漏掉前面的_
	va_end(vArgList);                            //用va_end宏结束可变参数的获取

	BOOL m_bwritelog = WriteLog(LOGLEVELERROR, str_tmp);
	return m_bwritelog;
}

//删除过期日志文件
void LOG::DeleteLog()
{

	//获取应用程序所在路径  创建log文件夹  获取log文件夹路径
	CString m_sLogFolderPath = CreatLogFolder();
	日志文件路径
	CString strLogFile;
	strLogFile.Format("%s\\*.log", m_sLogFolderPath);
	CFileFind finder;

	BOOL bWorking = finder.FindFile(strLogFile);

	while (bWorking)
	{
		bWorking = finder.FindNextFile();

		CTime currentTime = CTime::GetCurrentTime();
		CTime timeFile;
		finder.GetLastAccessTime(timeFile);
		CTimeSpan ts = currentTime - timeFile;
		int nSecond = (int)ts.GetTotalSeconds();

		if (nSecond > LOGSAVEDAYS * 24 * 60 * 60)//超时,过期
		{
			CString strFile;
			strFile.Format("%s\\%s", m_sLogFolderPath, finder.GetFileName());
			DeleteFile(strFile);
		}
	}
}

在VC(Visual C++)开发中,SQL Server类的功能介绍和重要性可以归纳为以下几点:

SQL Server类功能介绍

  1. 数据库连接管理

    • 自写类可以提供封装好的数据库连接方法,使开发者能够方便地连接到SQL Server数据库,而无需每次都编写复杂的连接代码。
    • 这类通常包含对连接字符串的管理、连接状态的检查以及异常处理等功能。
  2. 数据查询与操作

    • 自写类可以封装SQL查询语句的执行,包括SELECT、INSERT、UPDATE、DELETE等操作,使开发者能够简洁地调用方法进行数据库操作。
    • 通过参数化查询,可以提高查询的安全性,防止SQL注入攻击。
  3. 资源管理和优化

    • 自写类可以管理数据库连接资源,如连接池的创建、使用和释放,以提高性能和资源利用率。
    • 通过优化查询语句和执行计划,可以提高数据库的响应速度和吞吐量。

SQL Server类重要性

  1. 提高开发效率

    • 通过使用自写类,开发者可以避免重复编写相同的数据库操作代码,从而提高开发效率。
    • 封装好的功能使得代码更加简洁和易于维护。
  2. 增强代码安全性

    • 自写类可以提供参数化查询等安全措施,防止恶意用户通过SQL注入等方式攻击数据库。
    • 封装好的错误处理和日志记录功能可以帮助及时发现和应对安全问题。
  3. 提升系统稳定性

    • 通过事务处理和错误处理机制的封装,自写类可以确保数据库操作的完整性和一致性,减少因操作不当或异常情况导致的系统崩溃或数据损坏风险。
// AdoLx.h: Version 1.1(支持Unicode、支持VS2015和VC6编译环境)
//支持Unicode、支持Access、SQLServer和Oracle三大数据库
//
#pragma once
#include <windows.h>
#include <comdef.h>  
#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#pragma warning(default:4146)
using namespace ADODB;

class CAdoLx
{
	_RecordsetPtr m_pRst;
	_ConnectionPtr m_pConn;

	CString m_szLastError;
public:
	void Release()
	{
		m_pConn->Release();
	}
	BOOL GetFieldType(long nIndex, int &nType);
	enum EType { DBT_ACCESS, DBT_SQL, DBT_ORACLE };

	BOOL Connect(EType eType, LPCTSTR szDatabase, LPCTSTR szPass = NULL, LPCTSTR szUser = NULL, LPCTSTR szHost = NULL);

	int ExecSQL(LPCTSTR szSQL);
	//int ExecProc(LPCTSTR szSQL);
	BOOL Select(LPCTSTR szSQL);

	BOOL IsEOF();
	BOOL MoveNext();
	BOOL MovePrev();

	BOOL MoveFirst();
	BOOL MoveLast();

	BOOL GetFieldValue(LPCTSTR szField, COleDateTime &tValue);
	BOOL GetFieldValue(LPCTSTR szField, double &fValue);
	BOOL GetFieldValue(LPCTSTR szField, CString &sValue);
	BOOL GetFieldValue(LPCTSTR szField, int &iValue);
	int GetFieldMoney(LPCTSTR szField, double &fValue);


	BOOL GetFieldByIndex(long nIndex, COleDateTime &tValue);
	BOOL GetFieldByIndex(long nIndex, double &fValue);
	BOOL GetFieldByIndex(long nIndex, CString &sValue);
	BOOL GetFieldByIndex(long nIndex, int &iValue);
	BOOL GetFieldByIndex(long nIndex, long &lValue);
	BOOL GetFieldByIndex(long nIndex, DWORD &dwValue);
	BOOL GetFieldByIndex(long nIndex, UINT &iValue);
	BOOL GetFieldByIndex(long nIndex, char &cValue);
	BOOL GetFieldByIndex(long nIndex, short &nValue);
	BOOL GetFieldByIndex(long nIndex, BYTE &cbValue);
	BOOL GetFieldByIndex(long nIndex, WORD &wValue);

	BOOL GetFieldByIndex(long nIndex, TCHAR sValue[], int nSize);


	int GetFieldCount();
	BOOL GetFieldName(long nIndex, CString &szName);

	int GetRecordCount();
	CString GetLastError()
	{
		CString str = m_szLastError;
		m_szLastError.Empty();
		return str;
	}


	class CProc
	{
		/*
		enum ParameterDirectionEnum
		{
		adParamUnknown = 0,
		adParamInput = 1,
		adParamOutput = 2,
		adParamInputOutput = 3,
		adParamReturnValue = 4
		};
		*/
		CString m_szLastError;
		_CommandPtr m_pCmd;
		//_ConnectionPtr & m_pConn;
	public:
		LPCTSTR GetLastError() const
		{
			return m_szLastError;
		}
		int Exec();
		BOOL Create(_ConnectionPtr &pConn, LPCTSTR szProc);

		BOOL AddParam(LPCTSTR szVName, long lParam, ParameterDirectionEnum eDir = adParamInput);
		BOOL AddParam(LPCTSTR szVName, LPCTSTR szParam, ParameterDirectionEnum eDir = adParamInput);

		BOOL GetValue(LPCTSTR szVName, long &lParam);
		BOOL GetValue(LPCTSTR szVName, CString &lParam);

		void Release()
		{
			delete this;
		}
		CProc()
		{
		}

	};
	CProc* CreateProc(LPCTSTR szProc);
	int ExecProc(CProc* pProc);

	CAdoLx();
	virtual ~CAdoLx();

};


// AdoLx.cpp: Version 1.1(支持Unicode、支持VS2015和VC6编译环境)
//支持Unicode、支持Access、SQLServer和Oracle三大数据库
//

#include "stdafx.h"
#include "AdoLx.h"

//
// Construction/Destruction
//

CAdoLx::CAdoLx()
{
	::OleInitialize(NULL);
}

CAdoLx::~CAdoLx()
{

}

BOOL CAdoLx::Connect(EType eType, LPCTSTR szDatabase, LPCTSTR szPass, LPCTSTR szUser, LPCTSTR szHost)
{
	CString str;
	switch (eType)
	{
	case DBT_ACCESS:
	{
		str.Format(TEXT("Provider=MSDASQL.1;Persist Security Info=False;Data Source=MS Access Database;Initial Catalog=%s;Password=%s"),
			szDatabase, szPass);
	}
		break;
	case DBT_SQL:
	{
		str = TEXT("Driver=SQL Server;Server=");
		str += szHost;
		str += TEXT(";Database=");
		str += szDatabase;
		str += TEXT(";UID=");
		str += szUser;
		str += TEXT(";PWD=");
		str += szPass;
	}

		break;
	case DBT_ORACLE:
		str = TEXT("Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=");
		str += szUser;
		str += TEXT(";Password=");
		str += szPass;
		str += TEXT(";Data Source=");
		str += szDatabase;
		break;
	}

	try
	{
		m_pConn.CreateInstance(__uuidof(Connection));
		m_pConn->Open(_bstr_t(str), szUser, szPass, adModeUnknown);///连接数据库

	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		//	TRACE(m_szLastError+"\n");
		return FALSE;
	}
	return TRUE;

}


int CAdoLx::ExecSQL(LPCTSTR szSql)
{
	_variant_t vRet;
	try
	{
		m_pConn->Execute(szSql, &vRet, adCmdText);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return e.Error();
	}

	return (long)vRet;
}
BOOL CAdoLx::IsEOF()
{
	try
	{
		if (m_pRst->GetadoEOF())
			return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
	}
	return FALSE;
}


BOOL CAdoLx::Select(LPCTSTR szSQL)
{
	try
	{
		if (m_pRst)
			m_pRst->Close();
		m_pRst.CreateInstance(__uuidof(Recordset));
		//		m_pRst ->Open(szSQL,m_pConn.GetInterfacePtr(),adOpenForwardOnly,adLockReadOnly,adCmdText);
		m_pRst->Open(szSQL, m_pConn.GetInterfacePtr(), adOpenStatic, adLockReadOnly, adCmdText);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

	return TRUE;
}
int CAdoLx::GetFieldCount()
{
	try
	{
		return m_pRst->Fields->Count;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return -1;
	}
	return -1;
}

BOOL CAdoLx::GetFieldByIndex(long nIndex, TCHAR sValue[], int nSize)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
		{
			*sValue = 0;
			return TRUE;
		}
		//CString str = v.bstrVal;
		CString str(v.bstrVal);
		LPCTSTR p = str;
		int i = 0;
		while (--nSize && (*sValue = *p) != 0)
		{
			sValue++;
			p++;
		}
		if (!nSize)
			*sValue = 0;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

	return TRUE;
}
BOOL CAdoLx::GetFieldName(long nIndex, CString &szName)
{
	try
	{
		szName = (LPCTSTR)m_pRst->Fields->Item[nIndex]->Name;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}
BOOL CAdoLx::GetFieldValue(LPCTSTR szField, int &iValue)
{

	try
	{
		iValue = (long)m_pRst->GetCollect(szField);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}

BOOL CAdoLx::GetFieldByIndex(long nIndex, int &iValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		iValue = (long)v;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}

BOOL CAdoLx::GetFieldByIndex(long nIndex, CString &szValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			szValue.Empty();
		else
			szValue = v.bstrVal;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}

BOOL CAdoLx::GetFieldByIndex(long nIndex, COleDateTime &tValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			tValue = 0.0;
		else
			tValue = v;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}

BOOL CAdoLx::GetFieldByIndex(long nIndex, double &fValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			fValue = 0.0;
		else
			fValue = v;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}

BOOL CAdoLx::GetFieldByIndex(long nIndex, long &lValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			lValue = 0;
		else
			lValue = v;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}
/*
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
*/
BOOL CAdoLx::GetFieldByIndex(long nIndex, DWORD &dwValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			dwValue = 0;
		else
			dwValue = v.lVal;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}

BOOL CAdoLx::GetFieldByIndex(long nIndex, UINT &iValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			iValue = 0;
		else
			iValue = v.lVal;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}
BOOL CAdoLx::GetFieldByIndex(long nIndex, char &cValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			cValue = 0;
		else
			cValue = v.bVal;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}

BOOL CAdoLx::GetFieldByIndex(long nIndex, short &nValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			nValue = 0;
		else
			nValue = v;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}
BOOL CAdoLx::GetFieldByIndex(long nIndex, BYTE &cbValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			cbValue = 0;
		else
			cbValue = v;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}
BOOL CAdoLx::GetFieldByIndex(long nIndex, WORD &wValue)
{
	try
	{
		_variant_t v = m_pRst->GetCollect(nIndex);
		if (v.vt == VT_NULL)
			wValue = 0;
		else
			wValue = v.iVal;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

}

BOOL CAdoLx::MoveFirst()
{
	try
	{
		return m_pRst->MoveFirst() == S_OK;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}
BOOL CAdoLx::MoveLast()
{
	try
	{
		return m_pRst->MoveLast() == S_OK;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}

BOOL CAdoLx::MoveNext()
{
	try
	{
		return m_pRst->MoveNext() == S_OK;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}
BOOL CAdoLx::MovePrev()
{
	try
	{
		return m_pRst->MovePrevious() == S_OK;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}

BOOL CAdoLx::GetFieldType(long nIndex, int &nType)
{
	try
	{
		nType = m_pRst->Fields->Item[nIndex]->Type;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;

}

BOOL CAdoLx::GetFieldValue(LPCTSTR szField, CString &sValue)
{
	try
	{
		sValue = m_pRst->GetCollect(szField).bstrVal;
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}


}
BOOL CAdoLx::GetFieldValue(LPCTSTR szField, COleDateTime &tValue)
{
	try
	{
		tValue = (DATE)m_pRst->GetCollect(szField);
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}



int CAdoLx::GetRecordCount()
{
	try
	{
		return m_pRst->GetRecordCount();
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
}





BOOL CAdoLx::CProc::Create(_ConnectionPtr &pConn, LPCTSTR szProc)
{
	try
	{
		m_pCmd.CreateInstance(__uuidof(Command));
		m_pCmd->ActiveConnection = pConn;
		m_pCmd->CommandType = adCmdStoredProc;
		m_pCmd->CommandText = _bstr_t(szProc);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}

CAdoLx::CProc* CAdoLx::CreateProc(LPCTSTR szProc)
{
	if (m_pConn == NULL)return FALSE;
	CProc* pProc = new CProc;
	if (pProc->Create(m_pConn, szProc))
		return pProc;
	delete pProc;
	return NULL;
}

BOOL CAdoLx::CProc::AddParam(LPCTSTR szVName, long lParam, ParameterDirectionEnum eDir)
{
	if (m_pCmd == NULL)
		return FALSE;
	try
	{
		_ParameterPtr pParam = m_pCmd->CreateParameter(szVName, adInteger, eDir, sizeof(long), lParam);
		m_pCmd->Parameters->Append(pParam);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

	return TRUE;
}
BOOL CAdoLx::CProc::AddParam(LPCTSTR szVName, LPCTSTR szParam, ParameterDirectionEnum eDir)
{
	if (m_pCmd == NULL)
		return FALSE;
	try
	{
		_ParameterPtr pParam = m_pCmd->CreateParameter(_bstr_t(szVName), adVarChar, eDir, lstrlen(szParam) + 2, szParam);
		m_pCmd->Parameters->Append(pParam);
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}

	return TRUE;
}

int CAdoLx::CProc::Exec()
{
	try
	{
		m_pCmd->Execute(NULL, NULL, adCmdStoredProc);

	}
	catch (_com_error& e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return e.Error();
	}
	return 0;
}

BOOL CAdoLx::CProc::GetValue(LPCTSTR szVName, long &lParam)
{
	try
	{
		_variant_t var = m_pCmd->Parameters->GetItem(_bstr_t(szVName))->GetValue();
		lParam = var;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;
}

BOOL CAdoLx::CProc::GetValue(LPCTSTR szVName, CString &szParam)
{
	try
	{
		_bstr_t bstr = m_pCmd->Parameters->GetItem(_bstr_t(szVName))->GetValue();
		szParam = (LPCTSTR)bstr;
	}
	catch (_com_error &e)
	{
		m_szLastError = (LPCTSTR)e.Description();
		return FALSE;
	}
	return TRUE;

}

int CAdoLx::ExecProc(CProc* pProc)
{
	/*	try
	{
	if(FAILED(m_pCmd.CreateInstance(__uuidof(Command))))
	{
	return -1;

	}

	m_pCmd->ActiveConnection   =   m_pConn;
	m_pCmd->CommandType   =   adCmdStoredProc;
	m_pCmd->CommandText = L"P_LOGIN";

	_ParameterPtr pParam = m_pCmd->CreateParameter(_bstr_t("v_empno"), adInteger, adParamInput ,4,7839L);
	m_pCmd ->Parameters ->Append(pParam);

	pParam = m_pCmd->CreateParameter(_bstr_t("v_pass"), adVarChar, adParamInput ,20, "123456");
	m_pCmd ->Parameters ->Append(pParam);

	pParam = m_pCmd->CreateParameter(_bstr_t("v_return"), adInteger, adParamReturnValue, 0);
	m_pCmd ->Parameters ->Append(pParam);

	m_pCmd->Execute(NULL, NULL, adCmdStoredProc);
	long nRet = m_pCmd->Parameters->GetItem("v_return")->GetValue();

	}
	catch(_com_error &e)
	{

	m_szLastError =(LPCTSTR) e.Description();
	return e.Error();
	}*/
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1674759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云ECS服务器实例挂载数据盘步骤(磁盘自动挂载.、访问挂载点)

阿里云ECS服务器实例挂载数据盘步骤 相关指令 df -h 查看磁盘空间 du -sh * 查看使用内存大小1.磁盘自动挂载 首先登录阿里云ECS服务器&#xff0c;通过 df -h 命令查看当前磁盘挂载情况 通过 fdisk -l 命令查看磁盘情况&#xff0c;可以发现有两个盘&#xff1a; 系统盘 …

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1 漏洞概述 CVE-2018-2628 是 Oracle WebLogic Server&#xff08;WLS&#xff09;核心组件中的一个反序列化命令执行漏洞。此漏洞允许未授权的用户通过 T3 协议在远程服务器上执行任意命令&#xff0c;从而可能完全控制受影响的服务器。 2 影响版本 该漏洞影响了以下版本的…

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…

国外新闻媒体推广:多元化媒体分发投放-大舍传媒

前言 &#xff1a;随着全球化的进程&#xff0c;国外新闻市场呈现出快速发展的趋势。在这个趋势下&#xff0c;国外新闻媒体推广成为了各行业企业宣传业务的重要一环。本文将重点介绍大舍传媒的多元化媒体分发投放服务&#xff0c;以及对国外新闻媒体推广的意义。 1. 多元化媒…

前端已死? Bootstrap--CSS组件

目录 Bootstrap 下载 Bootstrap--全局CSS样式 栅格系统 栅格参数 正常显示 实例 代码演示: 排版 代码演示 表格 代码演示 表单 代码演示 等等...(文档很清晰了) Bootstrap--组件 结合演示:(页面) Bootstrap Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HT…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

lerna实战(一)

前言 将大型代码仓库分割成多个独立版本化的 软件包&#xff08;package&#xff09;对于代码共享来说非常有用。但是&#xff0c;如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪&#xff0c;并且&#xff0c; 跨越多个代码仓库的测试将迅速变得非常复杂。 …

使用System.Drawing绘制基本几何图形

1.使用System.Drawing绘制一个正方形 using System; using System.Drawing; using System.Windows.Forms;public partial class MyForm : Form {public MyForm(){// 你可以在这里设置Form的双缓冲&#xff0c;以避免绘制时出现的闪烁 this.DoubleBuffered true;}protected o…

论文阅读:Self-Consistency Improves Chain of Thought Reasoning in Language Models

思维链 prompt 与预训练的大型语言模型相结合&#xff0c;在复杂的推理任务上取得了令人鼓舞的结果。在本文中&#xff0c;作者提出了一种新的解码策略&#xff0c;即自我一致性&#xff08;self-consistency&#xff09;&#xff0c;以取代思维链 prompt 中使用的 naive 贪婪解…

易货模式:引领交易新潮流,实现资源高效利用

随着全球经济的繁荣和科技的日新月异&#xff0c;传统的交易模式正面临革新。在追求高效、便捷与环保的当下&#xff0c;易货模式作为一种新兴的交易方式&#xff0c;逐渐崭露头角&#xff0c;受到越来越多人的青睐。 易货模式&#xff0c;简而言之&#xff0c;就是通过平台或在…

AI日报:OpenAI全能模型GPT-4o发布;阿里推自动化视频剪辑神器;AI作品会侵权吗?调研结果...;零一万物开源Yi-1.5模型

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;https://top.aibase.com/ 1、干翻所有语音助手&#x…

FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多种动态内存分配方案&#xff0c;这些方案通过不同的内存管理器&#xff08;heap managers&#xff09;实现&#xff0c;主要位于 FreeRTOS/Source/portable/MemMang 目录下。以下是几种常见的动态内存分配方案&#xff1a; heap_1 特点&#xff1a; 简单性…

np.linalg.norm()

np.linalg.norm()是NumPy中用于计算向量或矩阵的范数的函数。它可以计算不同类型的范数&#xff0c;包括向量的L1范数、L2范数以及矩阵的Frobenius范数等。 基本用法如下, numpy.linalg.norm(x, ordNone, axisNone, keepdimsFalse) x&#xff1a;输入数组&#xff0c;可以是…

【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍

1-4 管道 管道符号&#xff1a; | &#xff0c;可以将前面指令的执行结果&#xff0c;作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入&#xff0c;意思就是查看ip addr 结果的后四行内容…

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性&#xff0c;能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先&#xff0c;让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域&#xff0c;大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片&#xff0c;被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点&#xff0c;并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力&#xff1a;M4芯片的…

2024上半年软考准考证什么时候出?怎么打印?

2024上半年软考准考证打印时间&#xff1a; 北京&#xff1a;5月21日至5月24日 天津&#xff1a;5月21日9:00后 河北&#xff1a;5月20日起 山西&#xff1a;5月20日上午9:00至5月28日下午14:00 内蒙古&#xff1a;5月20日-5月25日 吉林&#xff1a;5月20日开始 辽宁&am…

批量剪辑与转码解析:一键实现MP4到FLV顺畅转换的技巧

在数字化多媒体日益盛行的今天&#xff0c;视频格式转换成为了我们日常生活和工作中不可或缺的一部分。尤其是当需要将MP4格式的视频转换为FLV格式时&#xff0c;批量剪辑与转码功能的出现&#xff0c;极大地提升了我们处理视频的效率。本文将为您详细解析云炫AI智剪如何一键实…

基于CLAHE算法的图像增强及评价

摘要&#xff1a; 本研究旨在探讨对比度限制自适应直方图均衡化&#xff08;CLAHE&#xff09;算法在数字图像处理中的应用。CLAHE算法通过在局部区域内进行直方图均衡化&#xff0c;有效地增强了图像的对比度&#xff0c;并在保持图像细节的同时避免了过度增强的问题。本文通过…