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.rhkb.cn/news/327274.html

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

相关文章

网站localhost和127.0.0.1可以访问,本地ip不可访问解决方案

部署了一个网站, 使用localhost和127.0.0.1加端口号可以访问, 但是使用本机的ip地址加端口号却不行. 原因可能有多种. 可能的原因: 1 首先要确认是否localhost对应的端口是通的(直接网址访问), 以及你无法访问的那个本机ip是否正确(使用ping测试)&#xff1b; 2 检查本机的防火…

好题总结汇总

好题总结汇总 总结一些做完很有收获的题。 一、经典问题 DP的结合 1、题意&#xff1a; 给定 n n n 种颜色的球的数量 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;选出一些不同种类的球(也就是在n种球中选球的任意情况)&#xff0c;将球…

企业如何通过云服务器实现全球连通运营

如果说互联网是一座桥&#xff0c;连接起了全球各地的信息&#xff0c;那云服务器就如同一座高速公路&#xff0c;帮助企业轻松实现跨国家、跨时区的全球运营。 这个听起来像科幻电影的情节其实已经成为了我们现实生活的一部分。现在就来具体看一下如何做到这一点吧。 其一&…

【Linux】Linux——Centos7安装

【Linux】Linux——Centos7安装 新建虚拟机 选择自定义安装下一步 硬件兼容性使用默认最高即可&#xff0c;下一步 选择稍后安装操作系统&#xff0c;下一步 选择客户机操作系统为 Linux &#xff0c;并选择下方版本为所安装 Linux 镜像同版本&#xff0c;下一步 虚拟机名称与…

idea-自我常见配置

1. 主题配置 2. 显示方法分隔符 Editor->General->Appearance 3. 忽略大小写提示 Editor->General->Code Completion 4. 自动导包 Editor->general->Auto Import 5. 取消单行显示Tabs Editor->General->Editor Tabs 效果如下图&#xff1a; 6. 设置…

idea启动Jsp非maven项目时的一些步骤

文章目录 事前准备eclipse项目举例idea打开eclipse项目安装tomcat配置启动项启动测试 一些小问题到不到servlet 事前准备 非社区版idea【否则启动项无法配置】tomcatmysql eclipse项目举例 idea打开eclipse项目 剩下的全部下一步即可 安装tomcat 自己的文章 Javaweb - t…

OpenAI GPT-4

本文翻译整理自&#xff1a;https://openai.com/index/gpt-4-research/ (March 14, 2023) 文章目录 一、关于 GPT-4二、能力视觉输入Visual inputs: chart reasoningSample 2 of 7 操纵性Steerability: Socratic tutorSample 1 of 3 三、局限性四、风险与缓解措施五、训练流程…

caj文件是什么?caj是什么文件?考研学生赶紧收藏!

在学术研究的广阔领域中&#xff0c;尤其是对于那些致力于深入研究、不断拓宽知识边界的考研学子们来说&#xff0c;了解并掌握各种学术资源的获取与利用方法显得尤为重要。其中&#xff0c;CAJ文件作为一种常见的学术文件格式&#xff0c;其重要性和使用频率不容忽视。那么&am…

软件设计师笔记(三)-设计模式和算法设计

本文内容来自笔者学习zst 留下的笔记&#xff0c;都是零碎的要点&#xff0c;查缺补漏&#xff0c;希望大家都能通过&#xff0c;记得加上免费的关注&#xff01;谢谢&#xff01;本章主要以下午题出现形式为主&#xff01; 文章编辑于&#xff1a;2024-5-13 13:43:47 目录 1…

Midjourney Imagine API 申请及使用

Midjourney Imagine API 申请及使用 申请流程 要使用 Midjourney Imagine API&#xff0c;首先可以到 Midjourney Imagine API 页面点击「Acquire」按钮&#xff0c;获取请求所需要的凭证&#xff1a; 如果你尚未登录或注册&#xff0c;会自动跳转到登录页面邀请您来注册和登…

_remote.repositories作用

问题描述 明明我本地有某个依赖但是却还是报错&#xff0c;原因就是存在_remote.repositories且你的远程仓库中找不到该依赖&#xff0c;可能发生在你修改了远程仓库或镜像时。 例子 本地有这个依赖&#xff0c;但是报错。 解决 删除_remote.repositories文件&#xff0…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

Netgear无线路由器漏洞复现(CVE-2019-20760)

漏洞概述 漏洞服务&#xff1a; uhttpd 漏洞类型&#xff1a; 远程命令执行 影响范围&#xff1a; 1.0.4.26之前的NETGEAR R9000设备会受到身份验证绕过的影响 解决建议&#xff1a; 更新版本 漏洞复现 操作环境&#xff1a; ubuntu:22.04 qemu-version&#xff1a; 8.1…

傻瓜化备份/恢复K8S集群Etcd数据

前言&#xff1a; 备份重要数据&#xff0c;简化重复操作&#xff0c;让一指禅、点点点也能完成运维任务。 脚本呈现界面如下&#xff1a; 1、查看Etcd版本 rootmaster:~# cat /etc/kubernetes/manifests/etcd.yaml | grep image: | awk {print $2} registry.aliyuncs.com/goo…

品鉴中的精神内涵:如何通过红酒品味生活的美好与哲学

红酒不仅仅是一种物质享受&#xff0c;更是一种精神体验。在品鉴云仓酒庄雷盛红酒的过程中&#xff0c;我们能够品味到生活的美好与哲学&#xff0c;感受到红酒所蕴含的精神内涵。 红酒的精神内涵源于其酿造过程中所融入的时间和匠心。一瓶上好的红酒需要经过长时间的陈年&…

简单粗暴的翻译英文pdf

背景&#xff1a;看书的时候经常遇到英文pdf&#xff0c;没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。 Step 1 打开英文pdfCTRLA全选文字CTRLC复制打开记事本CTRLV复制保存为data.txt Step 2 写一个C脚本 // ToolPdf2Html.cpp : 此文件包含 "main&quo…

itextpdf 7生成pdf(主要是文字和表格,支持中文)

我们经常会遇到要导出pdf的需求,方式有很多种 今天的教程是采用itextpdf的方式生成pdf itextpdf是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档&#xff0c;而且可以将Html文件转化为PDF文件。 这里先展示一下效果图 首先在pom.xml中引入相关依赖 <dep…

JSR303数据校验 —— @Valid嵌套校验、集合校验

1. 依赖版本 &#xff08;1&#xff09;SpringBoot 3.1.11 &#xff08;2&#xff09;JDK17 2. Valid、Validated 简介 说明&#xff1a;在Spring框架中Valid默认不会对集合&#xff08;List、Set等&#xff09;内部的元素进行校验&#xff0c;需要将Spring提供的Validated注…

JVM调优工具命令详解(JVM调优看这一篇就够了)

Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 1 jmap ‐histo 14660 #查看历史生成的实例 2 jmap ‐histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class…

学校为何更热衷于使用SOLIDWORKS教育版教学

在当今的教育环境中&#xff0c;SOLIDWORKS教育版因其独特的优势&#xff0c;越来越受到学校的青睐。为什么学校更热衷于使用SolidWorks教育版进行教学呢&#xff1f;本文将从以下几个方面进行阐述。 首先&#xff0c;SOLIDWORKS教育版为学生们提供了一个与实际工程应用紧密结…