1.SQL Server中每张表的记录数大约控制在多少不会影响系统性能;
2.VC+SQL Server中CommandPtr的用法,我用来执行存储过程,老是报参数过多,然后退出!:Sample
PROC_PLRK @pIn1 varchar(50),@pIn2 smallint,@pOut small OUTPUT问题是第一次成功,第二次就报以上错误,有没有做过类似开发的给点提醒或者给段代码,我的代码大致是对CommandPtr指针的Parameters参数进行赋值,关键是如何做,程序逻辑?
if (mydlg.DoModal()==IDOK)
{
.............?
pCmd->Execute(,,)
}

解决方案 »

  1.   

    1、虽然这个与你的表的宽度、服务器配置、网络速度等有关系,但根据经验,条数到7位数速度一般不容易忍受。
    2、VC不熟,但我想ADO是一样的,每次调用pCmd->Execute(,,)前,对pCmd进行重新生成,或者只有第一次调用CreateParameter 方法,以后就只设置参数的值旧可以了。我估计是你每次都调用CreateParameter 方法,那样第二次调用pCmd->Execute(,,)时,你的参数数量就DOUBLE了。
      

  2.   

    1.也就是说每张表的记录控制在百万记录以内;
    2.说得有道理,可是每次我都用pCmd->Prarmeters->Refresh(),还是没有用;
    怎么解决呢,有没有做过Ado访问SQL Server的?
      

  3.   

    第一个问题是经验,我会考虑大家的意见;
    第二个问题我还是不太明白,我在调用的代码段对参数进行了
    pCmd->Parameters->Refresh();
    但还是会报错?后来我把AddParameters()函数放到父窗口的OnInitialUpdate
    还是没有通过?到底要怎样才能正确使用SQL+ADO+VC的存储过程呢?
    大家来谈谈吧!
      

  4.   

    1.主要是呢表的结构 一般是7位数 
    2。
       hr = pICommandText->QueryInterface(IID_ICommandProperties,
                                (void **)&pICommandProperties);
        if (FAILED(hr))
        {
            printf("Failed to get ICommandProperties to set rowset properties.\n");
            //Release any references and return.
            goto Exit;
        } //end if
        hr = pICommandProperties->SetProperties(cPropSets, rgPropSets);
        if (FAILED(hr))
        {
            printf("Execute failed to set rowset properties.\n");
            //Release any references and return.
            goto Exit;
        } //end if
        
        
    //从数据库种抽取数据项目
    strcpy(chrFilterSQL,"SELECT * FROM photo WHERE phtid=");
    strcat(chrFilterSQL,NewID);
    MultiByteToWideChar (CP_ACP, 0, chrFilterSQL, -1, strFilterSQL, 100);
    //以上代码是过滤条件 hr = pICommandText->SetCommandText(DBGUID_DBSQL,strFilterSQL);
        if (FAILED(hr))
        {
            printf("Failed to set command text SELECT * FROM.\n");
            //Release any references and return.
            goto Exit;
        } //end if

        hr = pICommandText->Execute(NULL, IID_IRowsetChange, NULL, NULL,
                                    (IUnknown**)&pIRowsetChange);
        if (FAILED(hr))
        {
            printf("Failed to execute the command SELECT * FROM.\n");
            //Release any references and return.
            goto Exit;
        } //end if
    ADO我也用过
      

  5.   

    谢谢楼上,以上代码似懂非懂,很眼熟而不是我用的ADO,
    我的指行方法很简单,关键是第二次就报参数错误!
      

  6.   

    我们做过测试,条数超过二千万时速度就发生问题了,现在我已经存到了1千万条数据,目前看来是没有问题的。
    这是我写的代码
    try
    {
    m_pCommand->Parameters->Item[ _variant_t( (long) 1 ) ]->Value = _variant_t((long)(GID) );
    m_pCommand->Parameters->Item[ _variant_t( (long) 2 ) ]->Value = _variant_t( (DataTime));
    m_pCommand->Parameters->Item[ _variant_t( (long) 3 ) ]->Value = _variant_t( (long)(Lon) );
    m_pCommand->Parameters->Item[ _variant_t( (long) 4 ) ]->Value = _variant_t( (long)(Lat) );
    m_pCommand->Parameters->Item[ _variant_t( (long) 5 ) ]->Value = _variant_t( (long)(Status) );
    m_pCommand->Parameters->Item[ _variant_t( (long) 6 ) ]->Value = _variant_t( (long)(Velocity) );
    m_pCommand->Execute( &vtEmpty, &vtEmpty2, adCmdStoredProc );
    }
    catch(_com_error &e)
        {
    AfxMessageBox(e.ErrorMessage());
    }
    其中 &vtEmpty, &vtEmpty2, 需要声明
    _variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);//调用存储过程的两个参数
    _variant_t  vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR);//调用存储过程的两个参数
    调用存储过程需要联结数据库
    m_pConnection = NULL;
    m_pCommand = NULL;
    _bstr_t bstrProc =( L"data_proc" );; //Stored procedure name
    try
    {
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pCommand.CreateInstance(__uuidof(Command));//m_pRecordset m_pConnection->ConnectionString = _bstr_t(m_strConnect1);
    m_pConnection->Open("","","",NULL); m_pCommand->ActiveConnection = m_pConnection;
    m_pCommand->CommandText = _bstr_t( bstrProc ); // passing the stored procedue
    m_pCommand->CommandType = adCmdStoredProc;     // type
    m_pCommand->Parameters->Refresh(); }
    catch(_com_error &e)
        {
    e.ErrorMessage();
    AfxMessageBox("数据库连接失败\n  请重新连接");
    }