自己封装的MFC操作SQL数据库的类(大家给点建议!)(四)

2014-11-24 15:34:19 · 作者: · 浏览: 3
eturn FALSE;
}
//添加记录 循环行
for (int i=0; i {
//告诉记录集要添加记录
m_pRecordset->AddNew();
//把记录一列一列的写进去
for (int ncloum=0;ncloum {
//传入的都是字符串 我要先得到列的数据类型 然后在做相应的转换 再把数据添加到数据库
//在数据库里列都是以集合形式存在的,所以先要得到所有的列,在从中得到每一个列
//Fields *pFiles 是个双指针
//1.得到所有的列
m_pRecordset->get_Fields(&pFiles);

//2.得到具体的列
//ADO的COM对数据库编程 除了定义了字符串其他的没有具体定义 ado把所有的数据类型都写在VARIANT这里面
varIndex.intVal = ncloum;
pFiles->get_Item(varIndex,&pFile);

//3.得到列(字段)对应的数据类型
pFile->get_Type(&dataType);

//4.转换 CString--》对应的类型 0 1 2 3 4 5 3
if (CStringToDataType(strCloumValue.GetAt(ncloum+i*nCloumNum),dataType,&varValue))
{
//5.添加记录
pFile->put_Value(varValue);
if (varValue.vt == (VT_UI1|VT_ARRAY))
{
SafeArrayDestroy(varValue.parray);
}
}

}
//更新数据
m_pRecordset->UpdateBatch(adAffectCurrent);
}
//关闭记录集 如果不关闭就会被一直占用,就打不开了
/*if (pStrReturnID)
{
m_pRecordset->MoveLast();
m_pRecordset->get_Fields(&pFiles);

varIndex.intVal = 0;
pFiles->get_Item(varIndex,&pFile);
VARIANT varKey;
pFile->get_Value(&varKey);

pStrReturnID->Format(_T("%d"),varKey.intVal);
}*/

m_pRecordset->Close();//记录集被关闭
}
}catch(_com_error *e)
{
AfxMessageBox(e->Description());
m_strErrorMsg.Format(_T("%s"),e->Description());
return FALSE;
}
return TRUE;
}
BOOL CDao::CStringToDataType(CString strValue,int nDataType, VARIANT *pVar)
{
switch(nDataType)
{
case adInteger: //整形
pVar->vt = VT_I2;
pVar->intVal = _ttoi(strValue);
break;
case adBoolean: //BOOL类型
pVar->vt = VT_BOOL;
pVar->bVal = _ttoi(strValue);
break;
case adSingle: //单精度
pVar->vt = VT_R4;
pVar->fltVal = (float)_tstof(strValue);
break;
case adDouble: //双精度
pVar->vt = VT_R8;
pVar->dblVal = _tstof(strValue);
break;
case adBSTR: //字符串
case adChar:
case adVarChar:
case adVarWChar:
case adWChar:
case adLongVarWChar:
case adLongVarChar:
pVar->vt = VT_BSTR;
pVar->bstrVal = (bstr_t)strValue;
break;
case adLongVarBinary:
//SaveImg(strValue,pVar);
break;
default:
pVar->vt = VT_EMPTY;
break;
}
return TRUE;
}

//修改数据的查询语句 列的个数, 修改的列名,列名对应值
BOOL CDao::EditData(CString strSQL, int nColumnNum, CString* pStrFieldName, CStringArray &saValue)
{
//todu:校验

int nIndex = 0; //列的索引
int nCount = 0; //修改的总数
int nTotal = (int)saValue.GetCount(); //一共修改的个数

HRESULT hRet;
_variant_t varFieldName;
_variant_t varValue;

_bstr_t bstrQuery = strSQL;
_bstr_t bstrConnent = m_strConnect;

try
{
hRet = m_pRecordset->Open(bstrQuery, bstrConnent, adOpenDynamic, adLockOptimistic, adCmdText);
if(!SUCCEEDED(hRet))
{
m_strErrorMsg = _T("打开表失败!");
return FALSE;
}
if (m_pRecordset->ADOEOF)
{
m_strErrorMsg = _T("没有选择修改的行");
m_pRecordset->Close();
return FALSE;
}
Fields *pFiles = NULL;
//ado把所有的数据类型都写在VARIANT这里面
VARIANT varIndex;
varIndex.vt = VT_I4; //R代表float CY==钱数 VT_带表的都是comADO代表的数据类型

Field *pFile = NULL;

while(!m_pRecordset->ADOEOF)
{
////修改哪一列 s# sname 1 'ss' 2 'ss2' stringarr 4 2
varFieldName.SetString((bstr_t)pStrFieldName[nIndex]);

varValue.SetString((bstr_t)saValue.GetAt(nCount));


m_pRecordset->Update(varFieldName,varValue);
nIndex++;
nCount++;
if(nIndex>=nColumnNum)
{
nIndex = 0;
m_pRecordset->MoveNext();
}

if (nColumnNum == 1)
{
if(nCount == nTotal)
{
break;
}
}
else
{
if(nCount > nTotal)
{
break;
}
}
}
m_pRecordset->Close();
}
catch(_com_error *e)
{
m_strErrorMsg = e->ErrorMessage();
AfxMessageBox(e->Description());
return FALSE;
}

return TRUE;
}
BOOL CDao::DeleteData(CString strSQL)
{
HRESULT hRet;

_bstr_t bstrQuery = strSQL;
_bstr_t bstrConnent = m_st