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

ops/2024/9/20 7:06:44/ 标签: 前端, 服务器, c++, 开发语言, 学习, c语言

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.ppmy.cn/ops/40814.html

相关文章

【PB案例学习笔记】-01创建应用、窗口与控件

写在前面 这是PB案例学习笔记系列文章的第一篇&#xff0c;也是最基础的一篇。后续文章中【创建程序基本框架】部分操作都跟这篇文章一样&#xff0c; 将不再重复。该系列文章是针对具有一定PB基础的读者&#xff0c;通过一个个由浅入深的编程实战案例学习&#xff0c;提高编…

Vue的学习 —— <vue指令>

目录 前言 正文 内容渲染指令 内容渲染指令的使用方法 v-text v-html 属性绑定指令 双向数据绑定指令 事件绑定指令 条件渲染指令 循环列表渲染指令 侦听器 前言 在完成Vue开发环境的搭建后&#xff0c;若想将Vue应用于实际项目&#xff0c;首要任务是学习Vue的基…

Java入门基础学习笔记14——数据类型转换

类型转换&#xff1a; 1、存在某种类型的变量赋值给另一种类型的变量&#xff1b; 2、存在不同类型的数据一起运算。 自动类型转换&#xff1a; 类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。 byte类型赋值给int类型&#xff0c;就是自动类型转换。 pack…

Hugging Muti Agent:第一章

Hugging Muti Agent系列文章目录 学习资料链接&#xff1a;Hugging Muti Agent&#xff08;二月学习&#xff09; 文章目录 Hugging Muti Agent系列文章目录第一章&#xff1a;前期准备1.1 获取MetaGPT1.2 配置MetaGPT1.2.1 调用 ChatGPT API 服务 1.3 首次尝试 第一章&#…

爬虫工作量由小到大的思维转变---<第七十四章 > Scrapy爬虫关闭方法(close)的机制及其在爬虫优化中的重要性

前言 Scrapy爬虫也有一个至关重要的功能——close方法&#xff0c;它控制着爬虫的“生命周期”。本论文旨在探讨Scrapy框架中close方法的核心作用和定义&#xff0c;以及它在爬虫管理与优化过程中的重要性。我们将深入探索如何通过这个强大的功能去优雅地结束一个爬取任务&…

【Unity】Unity项目转抖音小游戏(二)云数据库和云函数

业务需求&#xff0c;开始接触一下抖音小游戏相关的内容&#xff0c;开发过程中记录一下流程。 抖音云官方文档&#xff1a;https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/cloud-function-debug 1.开通抖音云环境 抖音云地址&a…

【springboot】整合oauth2.0和security,使用图形验证码和邮箱验证码登录

思路 当使用OAuth和Security框架(如Spring Security)进行登录,并且不使用密码而使用验证码时,生成Token的过程通常涉及以下几个步骤: 1.验证码生成与验证: 首先,系统会生成一个图形验证码并将其展示给用户。 用户输入他们看到的验证码。 系统验证用户输入的验证码是否…

docker的使用

docker的使用 1.首先&#xff0c;拉取一个镜像&#xff0c;如 docker pull 镜像名称 # 官方镜像 docker image pull 镜像名称 # 或简写为 docker pull 镜像名称 # 比如 docker pull ubuntu docker pull ubuntu:16.04# 个人镜像 docker pull 仓库名称/镜像名称 docker pull …

Linux sndconfig命令教程:如何在Linux下设置声卡(附实例详解和注意事项)

Linux sndconfig命令介绍 sndconfig&#xff08;Sound Configuration&#xff09;是一个用于设置声卡的命令。它支持即插即用&#xff08;Plug and Play&#xff0c;PnP&#xff09;设置&#xff0c;可以自动检测并设置PnP声卡。sndconfig命令可以帮助用户在Linux系统中配置声…

如何提高自己的全局视野?

以下是一些可以帮助提高全局视野的方法&#xff1a; 1. 广泛学习不同领域知识&#xff1a;包括但不限于技术相关的各个领域、业务知识、行业动态等&#xff0c;拓宽知识面。 2. 参与大型项目&#xff1a;积极投身到复杂的、规模较大的项目中&#xff0c;在实践中感受和理解系…

计算机毕业设计hadoop+spark+hive知识图谱bilibili视频数据分析可视化大屏 视频推荐系统 预测系统 实时计算 离线计算 数据仓库

研究意义 随着互联网的快速发展&#xff0c;人们面临着海量的视频内容&#xff0c;如何从这些繁杂的视频中找到自己感兴趣的内容成为一个重要的问题[1]。推荐系统作为一种解决信息过载问题的重要工具&#xff0c;能够根据用户的历史行为和偏好&#xff0c;预测用户可能感兴趣的…

nginx 负载均衡配置详解

基于 ${nginx_home}/conf/nginx.conf 文件配置实现&#xff0c;如下&#xff1a; http {# 定义server地址upstream server_group {server 192.168.xxx.1:8080;server 192.168.xxx.2:8080;server 192.168.xxx.3:8080;}server {listen 80;location / {root html;index …

Spring框架概述

目录 1. Spring框架的起源 2. Spring框架的构成 3. Spring的发展历程 4. Spring的开发环境 4.1. Maven安装与配置 &#xff08;1&#xff09;Maven的下载与安装 &#xff08;2&#xff09;配置Maven的环境变量 &#xff08;3&#xff09;本地仓库的配置 &#xff08;4…

变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

Modbus转Profinet网关&#xff08;XD-MDPN100/300/600&#xff09;的作用是将Modbus协议转换为Profinet协议&#xff0c;支持Modbus RTU主站/从站&#xff0c;并且Modbus转Profinet网关设备自带网口和串口&#xff0c;既可以实现协议转换的同时&#xff0c;也可以实现接口的转换…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

企业开发基础-JDBC(SQL注入)

JDBC概论 1、JDBC是什么&#xff1f; Java DataBase Connectivity&#xff08;Java语言连接数据库&#xff09; 2、JDBC的本质是什么&#xff1f; JDBC是SUN公司制定的一套接口&#xff08;interface&#xff09; java.sql.*; (这个软件包下有很多接口。) 接…

防火墙技术基础篇:什么是包过滤技术

什么是防火墙包过滤技术 当数据在网络中传输时&#xff0c;它们被分割成小的单元&#xff0c;称为数据包。防火墙的包过滤是一种基本的网络安全技术&#xff0c;用于检查这些数据包并根据预定义的规则决定是否允许它们通过防火墙。 防火墙包过滤是一种关键的网络安全技术&am…

MySQL————创建存储过程函数

存储过程使用大纲 无参数传递 delimiter $$ 声明一个名称为get_student_introduce CREATE PROCEDURE gei_student_introduce() 开始操作 BEGIN 撰写真正在操作DMLDQL都行 SET userName张三; select introduce 简介 from student WHERE userNameuserName; end $$ delimit…

关于我个人的编码规范(C/C++)

文章目录 前言一、文件结构1. 版权和版本声明&#xff08;不是必须&#xff0c;但是我建议看看&#xff09;2. 头文件结构3. 源文件结构 二、排版&#xff08;以 K&R 风格为主&#xff09;1. 缩进与左花括号的位置2. 空行的插入3. 该分行就分行4. 花括号5. 长语句分段6. 空…

跨境网络为何离不开海外静态住宅IP

在全球化日益加深的今天&#xff0c;跨境网络活动已成为商业和个人交流的常态。无论是远程办公、跨境电商还是国际社交&#xff0c;网络连接的稳定性和安全性都至关重要。而海外静态住宅IP作为连接不同国家和地区网络的关键元素&#xff0c;其重要性日益凸显。本文将深入探讨跨…