苦恼啊,我看不懂这个程序:
BOOL CDBOperation::InsertData(CString sUserid, CString TableName,
VARIANT vFieldNameList, VARIANT vFieldValueList,
BSTR* bsPkFieldNameList, BSTR* bsPkFieldValueList,
int& iPkFieldNum)
{
CString sSQL;
BOOL bRet = TRUE;
CString sTableName;
VARIANT vPkFieldNameList = {0}, vPkFieldValueList = {0};
BSTR bsFieldNameList[MAX_FIELD_NUM], bsFieldValueList[MAX_FIELD_NUM];
int iCount;
_variant_t vRowAffect; m_sErrorStr = _T("");
sTableName.Format("%s",TableName);
if ( sTableName.CompareNoCase("Check_Approve") == 0 ) // 往审阅表中添加数据
{
m_CheckApprove.SetDBOperation(this); // Added in 2005/02/25 17:59.Allocate resource if ( m_CheckApprove.AdjustValue(sUserid, TableName.AllocSysString(), vFieldNameList, vFieldValueList,
vPkFieldNameList, vPkFieldValueList,
bsFieldNameList, bsFieldValueList,
OPR_INSERT, iCount) )
{
vFieldNameList.wReserved1 = vFieldValueList.wReserved1 = iCount;
vFieldNameList.pbstrVal = bsFieldNameList;
vFieldValueList.pbstrVal = bsFieldValueList;
}
else return FALSE;
} sSQL = MakeInsertSql(sUserid, TableName, vFieldNameList, vFieldValueList);
g_TestLog.WriteLog((char*)(LPCTSTR)sSQL); // 执行插入操作
try
{
m_pConnection->Execute(_bstr_t(sSQL), &vRowAffect, 0);
}
catch ( _com_error &Err )
{
g_TestLog.WriteLog( Err.Description());
m_sErrorStr.Format("%s", Err.Description());
bRet = FALSE; return bRet;
} bRet = GetPKeyValue(TableName, bsPkFieldNameList, bsPkFieldValueList, sUserid, iPkFieldNum); return bRet;
}
尤其是变量转换的部分,我不懂啊?????
BOOL CDBOperation::InsertData(CString sUserid, CString TableName,
VARIANT vFieldNameList, VARIANT vFieldValueList,
BSTR* bsPkFieldNameList, BSTR* bsPkFieldValueList,
int& iPkFieldNum)
{
CString sSQL;
BOOL bRet = TRUE;
CString sTableName;
VARIANT vPkFieldNameList = {0}, vPkFieldValueList = {0};
BSTR bsFieldNameList[MAX_FIELD_NUM], bsFieldValueList[MAX_FIELD_NUM];
int iCount;
_variant_t vRowAffect; m_sErrorStr = _T("");
sTableName.Format("%s",TableName);
if ( sTableName.CompareNoCase("Check_Approve") == 0 ) // 往审阅表中添加数据
{
m_CheckApprove.SetDBOperation(this); // Added in 2005/02/25 17:59.Allocate resource if ( m_CheckApprove.AdjustValue(sUserid, TableName.AllocSysString(), vFieldNameList, vFieldValueList,
vPkFieldNameList, vPkFieldValueList,
bsFieldNameList, bsFieldValueList,
OPR_INSERT, iCount) )
{
vFieldNameList.wReserved1 = vFieldValueList.wReserved1 = iCount;
vFieldNameList.pbstrVal = bsFieldNameList;
vFieldValueList.pbstrVal = bsFieldValueList;
}
else return FALSE;
} sSQL = MakeInsertSql(sUserid, TableName, vFieldNameList, vFieldValueList);
g_TestLog.WriteLog((char*)(LPCTSTR)sSQL); // 执行插入操作
try
{
m_pConnection->Execute(_bstr_t(sSQL), &vRowAffect, 0);
}
catch ( _com_error &Err )
{
g_TestLog.WriteLog( Err.Description());
m_sErrorStr.Format("%s", Err.Description());
bRet = FALSE; return bRet;
} bRet = GetPKeyValue(TableName, bsPkFieldNameList, bsPkFieldValueList, sUserid, iPkFieldNum); return bRet;
}
尤其是变量转换的部分,我不懂啊?????
BSTR 是 字符串,带有一个四字节的头,指出串长度,还有它是双字节编码
_variant_t 是 VARIANT 的 封装器类
_bstr_t 是 BSTR 的 封装类
这两种类型一般用在 COM 智能指针的客户端, 就是 用 #import 指定引入的COM 接口 都是自动用 这些类型来对COM 接口 进行包装. 以方便客户端的凋用. 这些类型也可以在你平时的代码中使用,通过 q包含 comdef.h 头文件来获得.详细参考: MSDN -> VC++ 语言参考 -> COM 支持类