1.

m_pCommand->CommandText = "SELECT count(*) FROM Item WHERE URL = ?";
改为:
m_pCommand->CommandText = _bstr_t("SELECT count(*) FROM Item WHERE URL = ?");
2.
执行循环前打开事件探查器,执行循环时查看事件探查器中显示的SQL语句是否正确(例如url参数是否与urlArray的内容一致).

解决方案 »

  1.   

    楼主先试试吧,尤其要使用事件探查器看一下执行的SQL语句中URL参数是否正确.
      

  2.   

    我试了,第二遍运行时,参数值为空,如下:
    exec sp_executesql N'SELECT count(*) AS num FROM Item WHERE URL = @P1', N'@P1 char(200)', '-1
      

  3.   

    参数值param2->Value 单步运行时明明设置为http://www.xk88.com/xkmovie_html/film/2006-07-12/filmlist_47141.htm,为什么运行查询时为-1呢???
      

  4.   

    确认一下m_pCommand->Parameters集合中是否只有一个param2对象?
      

  5.   

    我的qq号是57497176,我这个问题比较着急,在qq中解决
      

  6.   

    检查代码,是否在其它地方向m_pCommand->Parameters中添加了参数对象.或者在循环前检查一下m_pCommand->Parameters->count的值.
      

  7.   

    检查了m_pCommand->Parameters->Count始终为1
      

  8.   

    这样试试(改动了二处):
    AdoNS::_ParameterPtr param2 = m_pCommand->CreateParameter( _bstr_t("@url"), AdoNS::adChar, AdoNS::adParamInput, 200, _bstr_t(""));  //改动1:为参数命名,必须以@开头
    m_pCommand->Parameters->Append(param2);// 添加参数
    AdoNS::_RecordsetPtr m_pRecordset1 = NULLfor (int i=0;i < nameArray->GetSize(); i++)
    {
    // 检查有无重复的记录
    m_pCommand->CommandText = "SELECT count(*) FROM Item WHERE URL = @url";// 改动2:去掉参数占位符,直接使用创建的参数名称
    param2->Value = _bstr_t(urlArray->GetAt(i));   //参数赋值
    m_pRecordset1 = m_pCommand->Execute(&vNULL, &vNULL, AdoNS::adCmdText);// 执行命令
    if(int(m_pRecordset1->Fileds->GetItem(0)->Value) == 0)   //如果结果集大于0则说明重复
    {
    m_pRecordset->AddNew(); 
    m_pRecordset->Fields->GetItem(_variant_t("Name"))->Value = _bstr_t(nameArray->GetAt(i));
    m_pRecordset->Fields->GetItem(_variant_t("Url"))->Value = _bstr_t(urlArray->GetAt(i));
    m_pRecordset->Fields->GetItem(_variant_t("EID"))->Value = _bstr_t(eid);
    m_pRecordset->Fields->GetItem(_variant_t("Sort"))->Value = _bstr_t(name);
    m_pRecordset->Update();  
    }
    }
      

  9.   

    在VS的IDE中,输入m_pCommand->之后就会出现该对象的所有属性和方法,这通常称为智能感知.
      

  10.   

    运行到pRecordset = pCommand->Execute(&vNULL, &vNULL, AdoNS::adCmdText)时出现异常,信息如下:"必须声明变量 '@LinkUrl'。
      

  11.   

    m_pCommand->CreateParameter( _bstr_t("@url")
    CommandText = "SELECT count(*) FROM Item WHERE URL = @url"
    参数名称要一致.请检查一下是否一致.
      

  12.   

    一致的,我用的参数名是@LinkUrl
      

  13.   

    还是出现如下异常信息:"必须声明变量 '@url'。"
      

  14.   

    这个异常信息是SQLSERVER返回的,应该是ADO参数没有传递成功.现在的问题已经明确了,与SQLSERVER无关,是VC前台使用ADO传递参数的问题.
      

  15.   

    估计是数据类型转换的问题.还是使用楼主原来的代码,即使用"?"作为参数占位符,然后将
    param2->Value = _bstr_t(urlArray->GetAt(i));   //参数赋值
    改为:
    param2->Value = _variant_t(urlArray->GetAt(i));   //把_bstr_t替换为_variant_t
      

  16.   

    还是一样,for循环的第一遍运行没问题,能检查出重复数据,但是第二遍以后不能检查出重复数据,int(m_pRecordset1->Fileds->GetItem(0)->Value)始终为0,今天先到这里吧
      

  17.   

    最后一试了,再不行就请楼主把问题发到VC版上,问题与ADO的参数对象有关,与SQL无关.
    循环时再用事件探查器检查一下生成的SQL语句._variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
    _variant_t  vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR);AdoNS::_ParameterPtr param2 = m_pCommand->CreateParameter( _bstr_t(""), AdoNS::adChar, AdoNS::adParamInput, 200, _bstr_t(""));
    pCommand->Parameters->Append(param2);// 添加参数
    AdoNS::_RecordsetPtr m_pRecordset1 = NULLfor (int i=0;i < nameArray->GetSize(); i++)
    {
    // 检查有无重复的记录
    m_pCommand->CommandText = _bstr_t("SELECT count(*) FROM Item "
                              "WHERE URL = ?");// 返回重复记录数量
    param2->Value = _variant_t(urlArray->GetAt(i));   //参数赋值
    m_pRecordset1 = m_pCommand->Execute(&vtEmpty, &vtEmpty2, AdoNS::adCmdText);// 执行命令
    if(int(m_pRecordset1->Fileds->GetItem(0)->Value) == 0)   //如果结果集大于0则说明重复
    {
    m_pRecordset->AddNew(); 
    m_pRecordset->Fields->GetItem(_variant_t("Name"))->Value = _bstr_t(nameArray->GetAt(i));
    m_pRecordset->Fields->GetItem(_variant_t("Url"))->Value = _bstr_t(urlArray->GetAt(i));
    m_pRecordset->Fields->GetItem(_variant_t("EID"))->Value = _bstr_t(eid);
    m_pRecordset->Fields->GetItem(_variant_t("Sort"))->Value = _bstr_t(name);
    m_pRecordset->Update();  
    }
    }
      

  18.   

    可以了,谢谢,vtEmpty、vtEmpty2这两个参数什么用的?