各位朋友,请问有人用C++ ODBC API来写过可以支持SQL存储过程的模块吗?请进来帮帮我啊!谢谢
写SQL存储过程,首先要知道有那个输入参数,那个输出参数,那个是输入输入参数,还有存储过程中怎样知道有多少个参数,请问怎样可以知道呢?
还有如果知道了这些内容请问又怎样去使用和绑定呢?
谢谢!如果有那位朋友是写过类似的C++代码类,请贴一小部分代码出来看看啊!本人万分感激!
问题点数:50、回复次数:3Top
1 楼bohut(●伯虎● )回复于 2005-01-13 08:43:18 得分 50
在vc中通过ODBC(不要ADO)调用
CREATE PROCEDURE Test
@Para1 int ,
@Para2 int ,
@Para3 int ,
@Ret int OUTPUT
AS
insert into test1 values (@Para1,@Para2,@Para3)
set @Ret = @Para1;
GO
///////////////////////////////////////////////////////////////////////////////
jnxulei(石头) ( ) 信誉:111
//------------------------------------------------------------------------------
CDatabase * pDatabase = new CDatabase;
pDatabase->OpenEx("DSN=ODBCName;UID=***;PWD=***", 0 );
CRecordset rs( pDatabase );
SQL.Format("{Test %d,%d,%d,%d}",Time0, Time1, Time2, Time3);
rs.Open( CRecordset::dynamic, SQL, CRecordset::none );
rs.GetFieldValue( (long)0, strReturn );
rs.Close();
pDatabase->Close();
delete pDatabase;
///////////////////////////////////////////////////////////////////////////////
lsp5i5j(星辰->女人在哪) ( ) 信誉:87
//------------------------------------------------------------------------------
ODBC有点麻烦,输入输出参数都有
int SimpleGetAccordOtherprocedure(CDatabase *dbCust,char *spstring,char *resultp,int *resultplen,int *ireturn,int *nIndex,char *sUserTel,char *sOtherId,char *sOtherTel,char *sOtherSex,char *sOtherOld)
{
char spstm[512];
int ret;
HSTMT hStmt;
int totallen=0;
SDWORD cbIn1=SQL_NTS, cbIn2=SQL_NTS, cbOut=1024,cbRet=0;
ret=SQLAllocStmt(dbCust->m_hdbc, &hStmt);
if(ret!=SQL_SUCCESS && ret!=SQL_SUCCESS_WITH_INFO)
return(-3503);
if(sizeof(spstm)<=strlen(spstring))
return(-3504);
strcpy(spstm,spstring);
ret=SQLPrepare(hStmt, (UCHAR *)spstm, SQL_NTS);
if(ret!=SQL_SUCCESS && ret!=SQL_SUCCESS_WITH_INFO)
return(-3504);
ret=SQLBindParameter(hStmt,1,SQL_PARAM_OUTPUT,SQL_C_SSHORT,SQL_INTEGER, 0, 0, ireturn, 0,&cbRet);
ret=SQLBindParameter(hStmt,2,SQL_PARAM_INPUT,SQL_C_SSHORT,SQL_INTEGER,0, 0, nIndex, 0, &cbIn1);
ret=SQLBindParameter(hStmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, DBACCESS_MAXPARAMLEN, 0, sUserTel, DBACCESS_MAXPARAMLEN,&cbIn1);
ret=SQLBindParameter(hStmt,4,SQL_PARAM_OUTPUT,SQL_C_CHAR,SQL_CHAR, DBACCESS_MAXPARAMLEN, 0, sOtherId, DBACCESS_MAXPARAMLEN,&cbIn2);
ret=SQLBindParameter(hStmt,5,SQL_PARAM_OUTPUT,SQL_C_CHAR,SQL_CHAR, DBACCESS_MAXPARAMLEN, 0, sOtherTel, DBACCESS_MAXPARAMLEN,&cbIn1);
ret=SQLBindParameter(hStmt,6,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, DBACCESS_MAXPARAMLEN, 0, sOtherSex, DBACCESS_MAXPARAMLEN,&cbIn1);
ret=SQLBindParameter(hStmt,7,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, DBACCESS_MAXPARAMLEN, 0, sOtherOld, DBACCESS_MAXPARAMLEN,&cbIn1);
ret=SQLExecute(hStmt);
if(ret!=SQL_SUCCESS && ret!=SQL_SUCCESS_WITH_INFO)
return(-3505); // printf("Error in execute!\n");
ret=TBSDBProcWU(hStmt,resultp,resultplen);
return ret;
}
参考:
---------------------------------------------------------------
http://www.vchelp.net/wyy/tour/odbc_api.asp#_Toc50053547
---------------------------------------------------------------
http://tech.ccidnet.com/pub/article/c1060_a58457_p1.html
:p
Top
2 楼hsz8250(terry)回复于 2005-01-13 09:24:38 得分 0
谢谢你的回复!但是如果我有很多的存储过程,大多数的都不是参数相同的,那请问怎么办呢?很难用一个方法或一个CLASS来包装起来!那该怎样办呢?谢谢!Top
3 楼hsz8250(terry)回复于 2005-01-13 09:25:33 得分 0
那请问是不是一个存储过程都要当一个特例来做?Top




