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

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 onceclass 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();elseszValue = 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;elsetValue = 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;elsefValue = 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;elselValue = 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;elsedwValue = 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;elseiValue = 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;elsecValue = 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;elsenValue = 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;elsecbValue = 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;elsewValue = 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.mzph.cn/pingmian/11763.shtml

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

相关文章

ASP.NET仪器设备管理系统设计与实现

摘 要 文中以某中小型企业的设备管理为例&#xff0c;对设备管理系统的设计与应用进行研究&#xff0c;旨在通过设备管理系统提高内部设备的利用率及实现其最大的经济效益。文中首先对设备管理的现状及其重要性进行了分析&#xff0c;分析实现设备管理信息系统的必要性与可行…

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库&#xff1f; MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑&#xff0c;然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录&#xff08;这里以D:…

AI学习指南概率论篇-随机变量和随机过程

AI学习指南概率论篇-随机变量和随机过程 随机变量和随机过程是概率论中重要的概念&#xff0c;也是在人工智能领域中经常应用的概念。本文将介绍随机变量和随机过程的概述&#xff0c;它们在AI中的使用场景&#xff0c;定义和意义&#xff0c;以及相关的公式讲解&#xff0c;并…

蓝桥杯备战17.bitset砝码称重

P2347 [NOIP1996 提高组] 砝码称重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) bitset 用来存储二进制 #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int w[] {0,1,2,3,5,10,20}; signed main() {std…

电商选品的数据是可以用爬虫进行采集的吗?

在电子商务领域&#xff0c;选品是一个至关重要的环节&#xff0c;它直接影响到商家的销售业绩和市场竞争力。为了做出更明智的选品决策&#xff0c;商家需要获取大量的市场数据和产品信息。那么&#xff0c;电商选品的数据是否可以通过爬虫进行采集呢&#xff1f; 爬虫在电商数…

更适合户外使用的开放式耳机,佩戴舒适音质悦耳,虹觅HOLME NEO体验

随着气温的逐渐升高&#xff0c;不管是在室内工作娱乐&#xff0c;还是到户外运动健身&#xff0c;戴上一款合适的耳机都会帮我们隔绝燥热与烦闷&#xff0c;享受音乐与生活。现在市面上的耳机类型特别多&#xff0c;我很喜欢那种分体式的开放耳机&#xff0c;感觉这种耳机设计…

亚信安慧AntDB:颠覆传统的开放创新数据库生态

亚信安慧AntDB是亚信科技自主研发的一款颠覆传统的开放创新数据库产品。它引入了分布式架构&#xff0c;通过数据的弹性伸缩、 容灾容错和负载均衡等技术手段&#xff0c;实现了高性能、高可靠性和高可扩展性的数据存储和处理能力。不仅如此&#xff0c;亚信安慧 AntDB还具备…

从头开始学Spring—02基于XML管理bean

目录 1.实验一&#xff1a;入门案例 2.实验二&#xff1a;获取bean 3.实验三&#xff1a;依赖注入之setter注入 4.实验四&#xff1a;依赖注入之构造器注入 5.实验五&#xff1a;特殊值处理 6.实验六&#xff1a;为类类型属性赋值 7.实验七&#xff1a;为数组类型属性赋值…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子&#xff1a; 评价类问题可用打分解决&#xff0c;比如&#xff1a;小华高考结束后&#xff0c;在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 &#xff08;一&#xff09;一道引出层次分析法的例…

如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者&#xff1a;来自 Elastic Musab Dogan 概述 Elasticsearch 提供两种类型的索引模板&#xff1a;旧&#xff08;legacy&#xff09;索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板&#xff0c;两者仍然可以在 Elasticsear…

深入理解MVCC与Read View:并发控制的关键要素

MVCC MVCC的几个问题1.update、insert、select和delete如何在MVCC中维护版本链&#xff1f;2.select读取&#xff0c;是读取最新的版本呢&#xff1f;还是读取历史版本&#xff1f;3.当前读和快照读4.那为什么要有隔离级别呢&#xff1f;5.如何保证&#xff0c;不同的事务&…

【go从入门到精通】golang单元测试

单元测试 随着软件开发变得越来越复杂,确保服务按预期运行至关重要。实现这一目标的方法之一是通过测试。在Go中,我们可以进行单元测试和集成测试,以确保我们的代码正确并满足要求。单元测试的最终目标是断言一小部分逻辑“单元”的行为符合预期。我们通过在测试中调用该函数…

Nginx - 配置文件结构(一)

安装Nginx 以 Ubuntu 为例&#xff0c;安装命令为 sudo apt install nginx常用指令 # 检查配置文件是否有问题 nginx -t# 热加载配置文件 nginx -s reload# 等待处理完当前请求并退出 nginx -s quit# 快速退出 nginx -s stop目录结构 nginx 默认安装位置一般在 /etc/nginx …

组件通信总结

组件通信是前端开发中的一个重要概念&#xff0c;它指的是组件之间通过某种方式来传递信息以达到某个目的。以下是对组件通信的总结&#xff1a; 一、组件间通信的分类 父子组件间通信&#xff1a;这是最常见的组件通信场景&#xff0c;主要使用自定义属性&#xff08;props&…

Automa:一键自动化,网页数据采集与工作流程优化专家

Automa&#xff1a;解锁自动化浏览器潜能&#xff0c;赋能工作效率&#xff0c;让复杂任务变得简单- 精选真开源&#xff0c;释放新价值。 概览 Automa是一款创新的网页自动化工具&#xff0c;专为寻求提升工作效率、简化数据收集过程的现代工作者设计。它融合了先进的数据抓取…

模板:vector(顺序表容器)

1.构造函数 explicit vector (const allocator_type& alloc allocator_type()); //默认构造函数explicit vector (size_type n, const value_type& val value_type(),const allocator_type& alloc allocator_type()); //n个重复的valtemplate <class Input…

Angular入门

Angular版本&#xff1a;Angular 版本演进史概述-天翼云开发者社区 - 天翼云 安装nodejs&#xff1a;Node.js安装与配置环境 v20.13.1(LTS)-CSDN博客 Angular CLI是啥 Angular CLI 是一个命令行接口(Angular Command Line Interface)&#xff0c;是开发 Angular 应用的最快、最…

大模型时代下两种few shot高效文本分类方法

介绍近年(2022、2024)大语言模型盛行下的两篇文本分类相关的论文&#xff0c;适用场景为few shot。两种方法分别是setfit和fastfit&#xff0c;都提供了python的包使用方便。 论文1&#xff1a;Efficient Few-Shot Learning Without Prompts 题目&#xff1a;无需提示的高效少…

深入了解 MyBatis 插件:定制化你的持久层框架

序言 MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了简单而强大的数据库访问功能。然而&#xff0c;有时候我们需要在 MyBatis 中添加一些自定义的功能或行为&#xff0c;来满足特定的需求。这时&#xff0c;MyBatis 插件就发挥了重要作用。本文将深入探讨 MyBati…

如何创建 Django 模型

简介 在上一篇教程“如何创建 Django 应用程序并将其连接到数据库”中&#xff0c;我们介绍了如何创建一个 MySQL 数据库&#xff0c;如何创建和启动一个 Django 应用程序&#xff0c;以及如何将其连接到一个 MySQL 数据库。 在本教程中&#xff0c;我们将创建 Django 模型&a…