代码如下
                  _ConnectionPtr conn;
_CommandPtr cmd;
_RecordsetPtr recordset;
_ParameterPtr img_id; conn.CreateInstance("ADODB.Connection");
cmd.CreateInstance("ADODB.Command");
img_id.CreateInstance("ADODB.Parameter");
recordset.CreateInstance("ADODB.Recordset"); try
{
conn->Open ( "DSN=dell;", "","",adModeUnknown);

cout << "Success" << endl;
cmd->ActiveConnection = conn;
cmd->CommandText = "getImageInformation";
cmd->CommandType = adCmdStoredProc;  img_id = cmd->CreateParameter("img_id",adInteger,adParamInput,-1, (_variant_t)"1");
cmd->Parameters->Append(img_id); recordset->CursorLocation = adUseClient; recordset = cmd->Execute(NULL,NULL,adCmdStoredProc); //这里的i是-1,怎么解决 ?
int i = recordset->RecordCount; FieldsPtr fileds = recordset->Fields; FieldPtr imgName = fileds->GetItem("Image_Name");

解决方案 »

  1.   

    我也发现了类似的问题
    try{
    _bstr_t perm,emp_name,emp_password;
    char *p;
    _ConnectionPtr pConnection;
    _RecordsetPtr pr;
    _CommandPtr c;
    emp_name = "小宝";
    emp_password = "暗暗"; ::CoInitialize(NULL);
    _bstr_t cnn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=zhangli;Initial Catalog=POWINSP;Data Source=OCEAN-ZHANGLI"; pConnection.CreateInstance("ADODB.Connection");
    pConnection->Open(cnn,"","",adConnectUnspecified);
    pr.CreateInstance("ADODB.Recordset");
    c.CreateInstance("ADODB.Command");    pr->CursorType = adOpenDynamic; c->CommandText = "SELECT * FROM TBL_EMPLOYEE WHERE EMP_NAME <> ? AND PASSWORD <> ?"; c->Parameters->Append(c->CreateParameter("name",adBSTR,adParamInput,10,emp_name)); c->Parameters->Append(c->CreateParameter("password",adBSTR,adParamInput,10,emp_password));
    c->ActiveConnection = pConnection.GetInterfacePtr();    pr  = c->Execute(NULL,NULL,adCmdText);    while(!pr->adoEOF)
        //if(pr->GetRecordCount() > 0)//这里就是总是得到-1
       {
    int i = pr->RecordCount;
    perm = SysAllocString((_bstr_t)pr->GetCollect("emp_name"));
    p = _com_util::ConvertBSTRToString(perm);
    pr->MoveNext();
       }
    }
    catch(_com_error e)
    {
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    MessageBox((LPCSTR) (bstrSource+bstrDescription),"COM系统调用错误",MB_ICONINFORMATION);
    }
      

  2.   

    与RecordSet的游标类型和锁定类型有关,参数设成adOpenStatic, adLockReadOnly,就可以了。
      

  3.   

    楼上说的是用rst->Open,但楼主问的是用execute无法获得正确recordcount值,我也有这样的问题,不太明白,但用Open可以获得正确值。
      

  4.   

    如果用execute返回的 Recordset 对象始终为只读、仅向前的游标。如需要具有更多功能的 Recordset 对象,应首先创建具有所需属性设置的 Recordset 对象,然后使用 Recordset 对象的 Open 方法执行查询并返回所需游标类型。对于recordcount来说Recordset 对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount 属性将返回 -1,对静态或键集游标返回实际计数,对动态游标取决于数据源返回 -1 或实际计数。
      

  5.   

    我也发现了这个问题,后来有段时间发现open时改为adOpenStatic模式就可以得到正确的值,但是最近又是-1了。用SELECT COUNT (*) FROM INFO也能得到记录数,但是我不知道怎样得到返回的int值。
        我昨天刚刚在CSDN上发了帖子,问这个问题,handsomerun(毛毛)老兄已经帮我解答了。http://community.csdn.net/Expert/topic/4619/4619835.xml?temp=.6759912
    谢谢handsomerun(毛毛)!
      

  6.   

    如果用Open或Execute得到的记录总值为-1或不正确时,可以将Recordset.MoveLast方法调用一下,然后再用.RecordCount取值,这样应可以取到正确的记录总数。(如下方法)Rec.Open(....) 或  Rec=con.Execute(...);
    Rec.MoveLast()   ;                //指针移到末记录
    Rec.MoveFirst()  ;                //移回首位置,保持与打开时同步
    int intCount=Rec.RecordCount();   //真正的记录总数就出来了。
      

  7.   

    CString strSQL;
    _variant_t var;
    m_pSet = m_pConn->Execute(strSQL.AllocSysString(),&var,adOptionUnspecified);
    long nRecords = var.lVal;
    这nRecords就保存着记录数