我在vc中用ADO的方法连接数据库,之前一直获取数据库表中的记录集,现在要统计数据的小时平均值,我在sql中用语句
select CONVERT(varchar(13),时间,120)as '时间',AVG(剂量率) as '平均值' from GM数据 
group by CONVERT(varchar(13),时间,120);请问我在VC中如何实现同样的功能,期待中!

解决方案 »

  1.   

    不了解这种复杂的sql语句用vc执行后产生什么结果。
    不过你可以把数据读到一个数组,自己计算。
    如果熟悉vector,就更简单一些。
      

  2.   

    直接在Open函数或excute函数中执行即可啊
      

  3.   

    可以直接执行,也可以写成PROCEDURE,然后用VC调用;
      

  4.   

      可用execute方法执行后返回对象是记录集_RecordsetPtr这样一个接口对象,我想获得的是统计数据的平均值;
      CString monitordatasql="select CONVERT(varchar(13),时间,120)as '时间',AVG(剂量率) as '平均值' from GM数据  group by CONVERT(varchar(13),时间,120);"
      _ConnectionPtr m_pConnection;
      _RecordsetPtr m_monitorser;
      m_monitorser=theApp.m_pConnection->Execute((_bstr_t)monitordatasql,NULL,adCmdText);
      

  5.   

    用这个软件试试,你会发现返回的记录集和其他平常SQL的是一样的。
      

  6.   

    我用的是Xproer.OleDb这个类库,以.Net风格封装的,写起代码来像堆积木一样简单。
    下面是使用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;//获取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;
    }
      

  7.   


    Xproer.OleDb  这个在哪里有下载?