VC 编程开发中的 封装类 :日志类 和SQL server 操作类 源代码
在VC(Visual C++)开发中,日志文件输出是一个至关重要的环节,它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开发中的介绍和其重要性的详细阐述:
日志文件输出的介绍
- 实现方式:在VC开发中,通常通过包含特定的头文件(如logfile.h)并调用相应的日志函数来实现日志的输出。这些函数能够将关键信息记录到指定的日志文件中。
- 兼容性:现代的日志输出工具通常具有良好的兼容性,能够支持不同版本的VC,如VC6、VC7(VS系列,包括VS2008)等,从而确保在不同开发环境下的一致性和可用性。
- 功能特性:高级的日志输出工具还支持源代码文件名及行号的输出,以及多线程应用。这使得开发人员能够更准确地定位问题来源,特别是在复杂的多线程环境中。
日志文件输出的重要性
- 问题定位与排查:日志文件是排查程序问题的主要工具。通过在关键位置打印日志,开发人员可以追踪程序的执行路径和数据状态,从而快速定位并解决问题。这在软件开发和测试阶段尤为重要。
- 系统监控与预警:在生产环境中,日志文件可以用于监控系统的运行状态和性能。通过分析日志文件,可以及时发现潜在的问题或异常,以便进行预警和干预,确保系统的稳定性和可靠性。
- 优化与改进:日志文件还可以提供关于系统使用情况和性能瓶颈的宝贵信息。开发人员可以利用这些信息对程序进行优化和改进,提高系统的整体性能和用户体验。
- 记录与审计:对于需要满足特定安全性或合规性要求的应用系统,日志文件可以作为重要的记录和审计工具。它可以记录用户的操作行为、数据变更等关键信息,以满足法律法规或行业标准的要求。
****************************************************************************
****************************************************************************
//功能: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类功能介绍
-
数据库连接管理:
- 自写类可以提供封装好的数据库连接方法,使开发者能够方便地连接到SQL Server数据库,而无需每次都编写复杂的连接代码。
- 这类通常包含对连接字符串的管理、连接状态的检查以及异常处理等功能。
-
数据查询与操作:
- 自写类可以封装SQL查询语句的执行,包括SELECT、INSERT、UPDATE、DELETE等操作,使开发者能够简洁地调用方法进行数据库操作。
- 通过参数化查询,可以提高查询的安全性,防止SQL注入攻击。
-
资源管理和优化:
- 自写类可以管理数据库连接资源,如连接池的创建、使用和释放,以提高性能和资源利用率。
- 通过优化查询语句和执行计划,可以提高数据库的响应速度和吞吐量。
SQL Server类重要性
-
提高开发效率:
- 通过使用自写类,开发者可以避免重复编写相同的数据库操作代码,从而提高开发效率。
- 封装好的功能使得代码更加简洁和易于维护。
-
增强代码安全性:
- 自写类可以提供参数化查询等安全措施,防止恶意用户通过SQL注入等方式攻击数据库。
- 封装好的错误处理和日志记录功能可以帮助及时发现和应对安全问题。
-
提升系统稳定性:
- 通过事务处理和错误处理机制的封装,自写类可以确保数据库操作的完整性和一致性,减少因操作不当或异常情况导致的系统崩溃或数据损坏风险。
// 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;
}