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:…

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

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

从头开始学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;不同的事务&…

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…

An 2024下载

An2024下载&#xff1a; 百度网盘下载https://pan.baidu.com/s/1cQQCFL16OUY1G6uQWgDbSg?pwdSIMS Adobe Animate 2024&#xff0c;作为Flash技术的进化顶点&#xff0c;是Adobe匠心打造的动画与交互内容创作的旗舰软件。这款工具赋予设计师与开发者前所未有的创意自由&#x…

HIVE卡口流量需求分析

HIVE卡口流量需求分析 目录 HIVE卡口流量需求分析 1.创建表格 插入数据 2.需求 3.总结&#xff1a; 1.创建表格 插入数据 CREATE TABLE learn3.veh_pass( id STRING COMMENT "卡口编号", pass_time STRING COMMENT "进过时间", pass_num int COMMENT …

【iOS】架构模式

文章目录 前言一、MVC二、MVP三、MVVM 前言 之前写项目一直用的是MVC架构&#xff0c;现在来学一下MVP与MVVM两种架构&#xff0c;当然还有VIPER架构&#xff0c;如果有时间后面会单独学习 一、MVC MVC架构先前已经详细讲述&#xff0c;这里不再赘述&#xff0c;我们主要讲一…

Golang | Leetcode Golang题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; func isScramble(s1, s2 string) bool {n : len(s1)dp : make([][][]int8, n)for i : range dp {dp[i] make([][]int8, n)for j : range dp[i] {dp[i][j] make([]int8, n1)for k : range dp[i][j] {dp[i][j][k] -1}}}// 第一个字符串从 …

【SAP ABAP学习资料】通过RFC接口上传图片至SAP 图片格式转换 图片大小调整

SAP图片相关&#xff1a; 链接: 【SAP ABAP学习资料】图片上传SAP 链接: 【SAP ABAP学习资料】屏幕图片预览 链接: 【SAP ABAP学习资料】smartforms打印图片&#xff0c;动态打印图片 需求&#xff1a; SAP上传图片只能本地电脑选择图片通过SE78或PERFORM IMPORT_BITMAP_BDS上…

Milvus入门初探

引言 Milvus 是一款开源的向量数据库&#xff0c;专为处理向量搜索任务而设计。它支持多种类型的向量&#xff0c;如浮点向量、二进制向量等&#xff0c;并且可以处理大规模的向量数据。Milvus 在 AI 应用中非常流行&#xff0c;尤其是在需要执行相似性搜索或最近邻搜索的场景…

【超详细】跑通YOLOv8之深度学习环境配置3-YOLOv8安装

环境配置3下载安装内容如下&#xff1a; 1、配置清华等镜像源 2、创建环境 3、下载安装Pytorch 4、下载安装YOLOv8运行环境 版本&#xff1a;Python3.8&#xff08;要求>3.8&#xff09;&#xff0c;torch1.12.0cu113&#xff08;要求>1.8&#xff09; 1、配置清华等镜…

算法-卡尔曼滤波之为什么要使用卡尔曼滤波器

假设使用雷达来预测飞行器的位置&#xff1b; 预先的假设条件条件: 1.激光雷达的激光束每5s发射一次&#xff1b; 2.通过接受的激光束&#xff0c;雷达估计目标当前时刻的位置和速度&#xff1b; 3.同时雷达要预测下一时刻的位置和速度 根据速度&#xff0c;加速度和位移的…