如何让ACCESS中的数据进行加法/减法运算ACCESS数据库中存放3个int型数据,用数据库读取的方法读出来变成LPCSTR类型的我先把他转换成int,要再换成LPCSTR型`部分代码
void CMasterDlg::OnAdd() 
{
// TODO: Add your control notification handler code here
//添加进账的部分
_variant_t var;
CTime date;
date=CTime::GetCurrentTime();
char *cYe,*vYe;

GetDlgItemText(IDC_ADDI,m_Ins);
GetDlgItemText(IDC_ADDR,m_ARe);
try
{
if(!m_pRecordset->adoEOF)
m_pRecordset->MoveLast();
else
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("日期",(LPCSTR)date.Format("%Y-%B-%d"));
m_pRecordset->PutCollect("存入",(LPCSTR)m_Ins);
OnYe();
vYe=itoa(Ye,cYe,10);
m_pRecordset->PutCollect("余额",(LPCSTR)vYe);
m_pRecordset->PutCollect("备注",(LPCSTR)m_ARe);
m_pRecordset->Update();
MessageBox("插入成功");
//刷新List的部分
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//////////////显示list//////////////
CString m_strDate,m_strIns,m_strOut,m_strYe,m_strRe;
if(!m_pRecordset->adoEOF)
m_pRecordset->MoveLast();
else
{
}
try
{
while(!m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("日期");
if(var.vt!=VT_NULL)
m_strDate=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("存入");
if(var.vt!=VT_NULL)
m_strIns=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("支出");
if(var.vt!=VT_NULL)
m_strOut=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("余额");
if(var.vt!=VT_NULL)
m_strYe=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("备注");
if(var.vt!=VT_NULL)
m_strRe=(LPCSTR)_bstr_t(var);
m_List.InsertItem(i," ");//第0行
m_List.SetItemText(i,0,m_strDate);
m_List.SetItemText(i,1,m_strIns);
m_List.SetItemText(i,2,m_strOut);
m_List.SetItemText(i,3,m_strYe);
m_List.SetItemText(i,4,m_strRe);
m_List.SetItemText(i++,0,m_strDate);//第i++行 m_pRecordset->MoveNext();
} }
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
/////////////
}int CMasterDlg::OnYe()
{
Ins=0,Out=0,Ye=0;
_variant_t var;
CString m_strDate,m_strIns,m_strOut,m_strYe,m_strRe;
FYe=0;
 
//i=0; if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("已经是第一个了");
return false;
}
try
{
while(!m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("日期");
if(var.vt!=VT_NULL)
m_strDate=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("存入");
if(var.vt!=VT_NULL)
m_strIns=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("支出");
if(var.vt!=VT_NULL)
m_strOut=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("余额");
if(var.vt!=VT_NULL)
m_strYe=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("备注");
if(var.vt!=VT_NULL)
m_strRe=(LPCSTR)_bstr_t(var); m_pRecordset->MoveNext(); Ins+=atoi(m_strIns);
Out+=atoi(m_strOut);
Ye=atoi(m_strYe);
Ye=Ins-Out;
// FYe=itoa(Ye,(char*)FYe,10);
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

return Ye;
}头文件里的
[code=C/C++]class CMasterDlg : public CDialog
{
// Construction
public:
int OnYe();
int i,Ins,Out,Ye;
LPCSTR FYe;
_RecordsetPtr m_pRecordset;
_ConnectionPtr m_pConnection;
CMasterDlg(CWnd* pParent = NULL); [/code]

解决方案 »

  1.   

    一条SQL语句就可以,
    Update table set 余额 = 存入- 支出
      

  2.   

    直接在SQL语句里面运算就可以了..:select test.a + test.b as ab from test
      

  3.   

    当然也可以提出数据库的资料 存放如2个不同的变量,进行运算后再存放回数据库,就免去了SQL语句的执行。
      

  4.   

    try
    {
    OnYe();
    itoa(Ye,&cYe,10);////////////
    m_pRecordset->AddNew();
    m_pRecordset->PutCollect("日期",(LPCSTR)date.Format("%Y-%B-%d"));
    m_pRecordset->PutCollect("存入",(LPCSTR)m_Ins);
    m_pRecordset->PutCollect("余额",(LPCSTR)&cYe);
    m_pRecordset->PutCollect("备注",(LPCSTR)m_ARe);
    m_pRecordset->Update();
    MessageBox("插入成功");
    我在把OnYe();
    itoa(Ye,&cYe,10);
    提到AddNew前面后加法运算成功,但是我刚刚添加的数据的余额就无法计算出,因为m_Ins在OnYe()的后面SQL没做过`看看先
      

  5.   

    不懂VC中的SQL操作
    不知道有没有人能给个参考的例子,或者书籍什么的
    看起来SQL要快的多,想学习下功能我通过函数的方法解决了,谢谢大家。
      

  6.   

    看样子,楼主对 SQL 还不了解。
    SQL 是一种标准语言,大部分数据库系统都实现了 SQL 标准。SQL 语言 是 应用程序 与 数据库系统 交流的语言。在 SQL 中计算,这个工作是放在 数据库 端的;你取过来再计算,这个工作是放在 客户 端的。
    像你这种小工作量计算无所谓哪里,但放在数据库端肯定好了,因为网络传输量小了;
    大工作量肯定要放在数据库端计算了,因为数据库服务器都是高性能的服务器,客户端都是叟客户端。
    这些都是 数据库 方面的知识,客户端的程序不一定是用VC++,用其它工具道理也一样。