sql 上有一个存储过程大约是这样的:
CREATE PROCEDURE proname
AS
declare @s2 varchar
set @s2 ='select * into _tmp from tablename'
exec (@s2)
select * from _tmp我原来是用ODBC开发的。我的ODBC中使用
crecordset rs(&db);
rs.open("exec proname");
这样做是可以得到正确的记录集的。
现在想把ODBC改成ado,用ado打开,就得不到正确的记录集。如果把存储过程中的exec (@s)去掉。就可以得到记录集。怎么做才能用ADO打开时,能得到正确的记录集呢?在ADO上设置,还是在存储过程中设置?
CREATE PROCEDURE proname
AS
declare @s2 varchar
set @s2 ='select * into _tmp from tablename'
exec (@s2)
select * from _tmp我原来是用ODBC开发的。我的ODBC中使用
crecordset rs(&db);
rs.open("exec proname");
这样做是可以得到正确的记录集的。
现在想把ODBC改成ado,用ado打开,就得不到正确的记录集。如果把存储过程中的exec (@s)去掉。就可以得到记录集。怎么做才能用ADO打开时,能得到正确的记录集呢?在ADO上设置,还是在存储过程中设置?
解决方案 »
- 头大 搞了一天了所有分都在这了【 error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声】
- 网络摄像头传输JPG的问题
- 一个CDocTemplate类对象怎么赋值给另一个CDocTemplate类指针所在的内存?
- 请问各位如何得到光驱,键盘,鼠标的信息,就像任务管理器一样
- 字符串与字符数组转化的问题?
- 要签合同了,散分!!!
- 我做了一个多文档应用程序,并做了几个菜单命令和工具栏命令。我想让关闭视图后工具栏按钮变灰不可以执行命令,请问应该怎么办?解决问题
- CString对象,字符串怎么转换成int,float
- 请大家介绍几本 *VC数据库编程*的书!
- 键盘钩子出错,如何调试??请教
- 希望高手们给我一点提示,自动根据xml写的结构定义导出头文件.h
- VC保存对话框的实现?
_variant_t((IDispatch*)m_pDatabase->GetConnection(), true),
adOpenStatic, adLockOptimistic, 1));
_variant_t((IDispatch*)m_pDatabase->GetConnection(), true),
adOpenStatic, adLockOptimistic, adCmdStoredProc);
{
_CommandPtr cmd;
_ParameterPtr par1;
_ParameterPtr par2;
_variant_t vtEmpty1( DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2( DISP_E_PARAMNOTFOUND, VT_ERROR); cmd.CreateInstance(__uuidof(Command));
cmd->ActiveConnection = pConn;
cmd->put_CommandType (adCmdStoredProc);
par1 = cmd->CreateParameter(_bstr_t(L"par1"),adChar,adParamInput ,16,vtMissing );
par1->put_Value(_variant_t(szUserID));
par2 = cmd->CreateParameter( _bstr_t(L"par2"), adChar, adParamInput, 16,vtMissing );
par2->put_Value( _variant_t( szNewPassword )); cmd->Parameters->Append(par1);
cmd->Parameters->Append(par2); cmd->put_CommandText ( _bstr_t(L"ModifyUser"));
cmd->Execute(&vtEmpty1 ,&vtEmpty2 ,adCmdStoredProc); bChanged = ValidateUser( szUserID, szNewPassword );
}
catch(_com_error& e)
{
_bstr_t bstrMessage = ReportError( e );
AfxMessageBox( bstrMessage, MB_ICONINFORMATION );
}
CREATE PROCEDURE proname
AS
declare @s2 varchar
--set @s2 ='select * into _tmp from tablename'
exec ('select * into _tmp from tablename')
select * from _tmp就可以成功了..
晕!
declare @s2 varchar
set @s2 ='select * into _tmp from tablename'
exec (@s2)
与
declare @s2 varchar
exec ('select * into _tmp from tablename')
有什么不同啊。
再说了,实际运用中。sql语句是动态生成,必需要先放入@s2中的,然后再执行
----------------------------------------------------------------------
如果varchar后面不指明长度,则默认长度为1.
declare @s2 varchar(8000)
不用改存储过程,在程序中,在open前,先执行set nocount on
就OK了。要改客户的存储过程太复杂了,宁可改程序了