谁能给一个c++中用ODBC API调存储过程的例子,最好带输出参数(output)那种,而且输出记录不止一条。在线等待,100如不够,可以再加!!!

解决方案 »

  1.   

    创建存储过程
    create proc getdataid (@termid int,@dataid int output)  
    as  
    select DataID from PlotInfo where TermID=@termid order by r_index 
    go////////////////////在查询器中,执行:
    declare @dataid int 
    exec  getdataid 13,@dataid output 
    结果:
    159
    169////////////////////
    用ODBC API调用:
      typedef unsigned long   uuid;
      char szStr[SQLLEN];
      uuid *sk;
      typedef struct
     {
    uuid val;
    SDWORD  num;
    } Tlng;   sk = new uuid[2];
       meset(sk,0x00,sizeof(uuid)*2);
      sprintf(szStr,"{call proc getdataid(13,?)}"); 
      SqlLonglhl(&hdsys,szStr,&sk,2,0);
     //调用下面数据库函数:
    sword DataBase::SqlLonglhl(struct Handle_Data *hd, char *szSql,uuid *pdata,int n,int flag)
    {
       Sleep(MINSLEEP);
    UDWORD   crow,i;
    UWORD    *rtn;
    HSTMT   hstmtU=NULL;
    RETCODE retcode=1;
    Tlng *ap = new Tlng [n];
    rtn = new UWORD [n];
            memset(ap,0x00,sizeof(Tlng)*n);
            SetupConnect(hd,LBaseHost);//连接数据库,调试时成功
    if( hd->hstmt == NULL) 
    SQLAllocHandle(SQL_HANDLE_STMT,hd->hdbc,&hd->hstmt);
    retcode = SQLSetStmtOption(hd->hstmt, SQL_BIND_TYPE, sizeof(Tlng));
    retcode = SQLSetStmtOption(hd->hstmt, SQL_ROWSET_SIZE, n); retcode = SQLPrepare(hd->hstmt,(UCHAR *)szSql,SQL_NTS); //此处出错
      retcode = SQLExecute(hd->hstmt); 
         retcode = SQLBindParameter(hd->hstmt, 1,    SQL_PARAM_OUTPUT,SQL_C_LONG,SQL_INTEGER, 0, 0, &ap[0].val, 0, &ap[0].num);
    retcode = SQLExtendedFetch(hd->hstmt, SQL_FETCH_NEXT,0, &crow,rtn);
        //if(retcode<0) SqlErrMsg(henvrpc,hdbcrpc, hstmtU,"RPC fetch num");
    SQLFreeHandle(SQL_HANDLE_STMT, hd->hstmt);
    hd->hstmt = NULL;
    if( retcode >= 0 && crow <= (UWORD)n )
    {
    for( i= 0; i<crow; i++) pdata[i] = ap[i].val;
    }

    delete [] ap;
    delete [] rtn;
    return  crow;} 请专家答疑,高分相送!!