void CBuyGoods::OnButtonBuy() 
{
_variant_t vUserID,vUserName,vGoodsID,vGoodsName,vGoodsPrice,vGoodsClass,vGoodsCount,vUserPhone,vUserAddress,vGoodsState;
CString GoodsState ="未派送";
UpdateData(TRUE);
m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveNext();
}
m_pRecordset->AddNew();
if(!m_pRecordset->adoEOF)
{
vUserID = theApp.m_strUserID;
vUserName = theApp.m_strUserName;
vGoodsID.lVal = theApp.m_GoodsId;
vGoodsName = theApp.m_GoodsName;
vGoodsPrice.lVal = theApp.m_GoodsPrice;
vGoodsClass = theApp.m_GoodsClass;
vGoodsCount.lVal = m_GoodsCount;
vUserPhone = m_UserPhone;
vUserAddress = m_UserAddress;
vGoodsState = GoodsState;
  m_pRecordset->PutCollect("UserId",vUserID);
  m_pRecordset->PutCollect("UserName",vUserName);
  m_pRecordset->PutCollect("GoodsId",vGoodsID.lVal);
   m_pRecordset->PutCollect("GoodsName",vGoodsName);
  m_pRecordset->PutCollect("GoodsPrice",vGoodsPrice.lVal);
   m_pRecordset->PutCollect("GoodsClass",vGoodsClass);
  m_pRecordset->PutCollect("GoodsCount",vGoodsCount.lVal);
  m_pRecordset->PutCollect("UserPhone",vUserPhone);
  m_pRecordset->PutCollect("UserAddress",vUserAddress);
m_pRecordset->PutCollect("GoodsState",vGoodsState);
m_pRecordset->Update();
}
MessageBox("购买礼品成功!","礼品购买及派送系统!",MB_OK|MB_ICONWARNING);
// TODO: Add your control notification handler code here

}
打开记录集对着呢,读取表中已有数据也对,不知道怎么回事了

解决方案 »

  1.   

    推荐使用Xproer.OleDb类库。
    过去对于开发人员来说在VC中进行数据库开发是一件并不轻松的事情,就算是一个简单的添加或者是删除操作都需要开发人员编写大量的代码。由于VC操作数据库需要使用一些特殊的语法和类型,这些类型没有统一的规范文档和示例,导致开发人员不能深理解。从而使得开发人员编写的代码不能简单高效。随着时间的推移这些代码最终将会变成产品的负担。因为它将影响产品的后续开发工作。
    现在Xproer.OleDb类库采用全新的设计理念为VC数据库开发带来了革命性的变化。采用Xproer.OleDb类库将使得VC数据库开发工作变得比以往任何时侯都要简单。对于常用的增删改查功能开发人员再也不需要编写大量的代码了,甚至有时侯只需要编写一行代码就能实现删除功能。
    由于良好的构架设计,开发人员能够根据业务需求来对Xproer.OleDb进行扩展和修改。借助于一些代码生成器,开发人员能够在10秒钟内实现对一张包含30个字段的数据表的所有操作(增,删,改,查)。对于信息管理系统的开发商来讲,这些改进将会成倍的提高公司的开发效率。新的设计为后期的维护工作节省了成本,对于系统后期的维护人员来讲,不再需要理解复杂的数据库操作代码,只需要关心业务逻辑,而且即便是调试代码也将会变得前所未有的轻松。
    无论是VC数据库开发新手,还是一个拥有多年VC数据库开发经验的人都能够在10分钟内掌握Xproer.OleDb类库的使用。Xproer.OleDb类库为开发人员带来的不仅是开发工作效率的提升,更是为解决更复杂的业务需求提供了最佳的解决方案。以下示例演示如何从数据表中删除一条数据#include "stdafx.h"
    #include "XproerDataDef.h"
    #include "OleDb/OleDbCommand.h"
    #include "OleDb/OleDbConnection.h"
    #include "OleDb/OleDbDataReader.h"
    #include "OleDb/DataTable.h"
    #include "OleDb/DataRow.h"
    #include "OleDb/DataValue.h"using namespace Xproer::OleDb;int _tmain(int argc, _TCHAR* argv[])
    {
    ::CoInitialize(NULL);
    OleDbConnection con;
    //设置Access数据库,兼容Access 97,Access 2000,Access 2003,Access 2007,Access 2010
    con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
    con.Open(); OleDbCommand cmd(&con);
    //设置SQL命令
    cmd.SetCommandText(L"delete from xdb_news where id=1"); 
    cmd.ExecuteNonQuery();

    con.Close();//关闭数据库连接 ::CoUninitialize();
    system("pause");
    return 0;
    }
    以下示例演示对数据库的多种操作:#include "stdafx.h"
    #include "XproerDataDef.h"
    #include "OleDb/OleDbCommand.h"
    #include "OleDb/OleDbConnection.h"
    #include "OleDb/OleDbDataReader.h"
    #include "OleDb/DataTable.h"
    #include "OleDb/DataRow.h"
    #include "OleDb/DataValue.h"using namespace Xproer::OleDb;//获取DataTable的示例
    void ADODataTable(OleDbCommand& cmd)
    {
    int count = 0;
    cmd.ExecuteScalar(L"select count(*) from xdb_news",count);
    auto_ptr<DataTable> table;
    table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news")); size_t rowCount = table->GetRowsCount();
    for (int i = 0 ; i < rowCount ; ++i)
    {
    DataRow* row = table->GetRow(i);
    DataValue* val = row->GetCel(0);

    printf("时间:%d \r\n", val->ToBoolean() );
    }
    }//使用OleDbDataReader快速读取数据的示例
    void ADORead(OleDbCommand& cmd)
    {
    OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
    USES_CONVERSION;
    wstring title;
    while(r->Read())
    {
    //r->GetString(0,title);
    //printf("标题:%s \r\n",W2A(title.c_str()));
    printf("ID:%f \r\n", r->GetFloat(0) );
    }
    r->Close();
    }//通过变量向数据库安全添加数据的示例
    void ADOAdd(OleDbCommand& cmd)
    {
    cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");
    cmd.AddDoubleParam(L"@VDouble",125022.3180); cmd.ExecuteNonQuery();
    }//高性能向数据库插入数据的示例
    void ADOParam(OleDbCommand& cmd)
    {
    cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");
    cmd.AddInt32Param(L"@ID",886);
    cmd.SetPrepared(true); _variant_t index = (short)0;
    _ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);
    param->Value = 887;
    cmd.ExecuteNonQuery();
    param->Value = 888;
    cmd.ExecuteNonQuery();
    param->Value = 889;
    cmd.ExecuteNonQuery();
    param->Value = 890;
    cmd.ExecuteNonQuery();
    param->Value = 891;
    cmd.ExecuteNonQuery();
    }//向数据库添加实数的示例
    void NumericScaleX(OleDbCommand& cmd)
    {
    OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
    _RecordsetPtr& rs = r->GetRecordsetPtr();
    rs->MoveFirst(); _variant_t vi = (short)0;
    FieldPtr fd = rs->Fields->GetItem(vi);
    unsigned char numeri = fd->GetNumericScale();
    unsigned char precision = fd->GetPrecision(); printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );
    printf("GetPrecision:%d\r\n", fd->GetPrecision() );
    printf("Value:%f\r\n", (float)fd->Value );
    r->Close();
    }int _tmain(int argc, _TCHAR* argv[])
    {
    ::CoInitialize(NULL);
    OleDbConnection con;
    con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
    con.Open(); OleDbCommand cmd(&con); ADORead(cmd);

    con.Close(); ::CoUninitialize();
    //printf("总数:%d",count);
    system("pause");
    return 0;
    }
      

  2.   

    楼主,你的问题解决了木有?我现在也碰到了一样的问题了:无法一次性向Access数据库中添加多条记录,循环也不行...好像那个AddNew函数不能用于多次插入记录