急!急!急!VC调用含动态输入条件的存储过程出现问题!
小弟初学数据库,遇到问题,请教高手,如下所述:
1、SQL Server2005存储过程,该存储过程编译通过,测试功能正常:
if exists(select * from sys.objects where object_id = OBJECT_ID('dbo.p_QueryCity') and type = 'P')
drop procedure dbo.p_QueryCity;
go
Create Procedure dbo.p_QueryCity
@CityName nvarchar(50)
as
declare @Ret int,@Reason nvarchar(max);
select @Ret = 0,@Reason = N'';
declare @sqlcmd nvarchar(max)
,@CityNameCondition nvarchar(max)
select @sqlcmd = 'select
CityName
,CityNameDesp
,CityLoc
from CityTable where 1 = 1';
--动态条件查询
if @CityName <>'' and @CityName is not null
select @CityNameCondition = ' and CityName = '''+@CityName+'''';
else
select @CityNameCondition = '';
select @sqlcmd = @sqlcmd+@CityNameCondition
print @sqlcmd;
exec sp_executesql @sqlcmd
if @@error <> 0
begin
select @Ret = -1, @Reason = N'T-SQL DML命令执行时错误';
end
select @Ret as ret, @Reason as failreason;
return @Ret;
go
2、VC6.0代码中与数据库SQL Server2005采用ODBC方式,
调用存储过程代码如下:
前面连接数据库就省略不写了,直接写如何调用存储过程:
//.....连接数据库过程省略
SQLRETURN hRecode;
SQLINTEGER CbSatid = SQL_NTS;
//执行SQL命令
hRecode = SQLExecDirect(m_hstmt, (UCHAR*)"exec p_QueryCity ''", SQL_NTS);
if ( (hRecode != SQL_SUCCESS) && (hRecode != SQL_SUCCESS_WITH_INFO) )
{
return;
}
//获取结果集
while ( hRecode = SQLFetch(m_hstmt ) != SQL_NO_DATA_FOUND)
{
//此时已经有问题了,下面的SQLGetData也不会取到任何数据,
//此时调用SQLError函数获取到SqlState = 24000,ErrorMsg = [Microsoft][ODBC SQL Server Driver]无效的游标状态
char szCity[100] = {0};
char CityNameDesp[100] = {0};
char CityLoc[100] = {0};
SQLGetData(m_hstmt, 1, SQL_C_TCHAR, szCity, 99, &CbSatid);
SQLGetData(m_hstmt, 2, SQL_C_TCHAR, CityNameDesp, 99, &CbSatid);
SQLGetData(m_hstmt, 3, SQL_C_TCHAR, CityLoc, 99, &CbSatid);
}
3、后来对数据库存储过程修改为如下:
if exists(select * from sys.objects where object_id = OBJECT_ID('dbo.p_QueryCity') and type = 'P')
drop procedure dbo.p_QueryCity;
go
Create Procedure dbo.p_QueryCity
@CityName nvarchar(50)
as
declare @Ret int,@Reason nvarchar(max);
select @Ret = 0,@Reason = N'';
select
CityName
,CityNameDesp
,CityLoc
from CityTable where 1 = 1 and (@CityName is null or @CityName = '' or CityName = @CityName);
if @@error <> 0
begin
select @Ret = -1, @Reason = N'T-SQL DML命令执行时错误';
end
select @Ret as ret, @Reason as failreason;
return @Ret;
go
4、重新执行步骤2中的代码,可以正常获取到数据,各位大侠能告诉小弟是什么原因????
1、SQL Server2005存储过程,该存储过程编译通过,测试功能正常:
if exists(select * from sys.objects where object_id = OBJECT_ID('dbo.p_QueryCity') and type = 'P')
drop procedure dbo.p_QueryCity;
go
Create Procedure dbo.p_QueryCity
@CityName nvarchar(50)
as
declare @Ret int,@Reason nvarchar(max);
select @Ret = 0,@Reason = N'';
declare @sqlcmd nvarchar(max)
,@CityNameCondition nvarchar(max)
select @sqlcmd = 'select
CityName
,CityNameDesp
,CityLoc
from CityTable where 1 = 1';
--动态条件查询
if @CityName <>'' and @CityName is not null
select @CityNameCondition = ' and CityName = '''+@CityName+'''';
else
select @CityNameCondition = '';
select @sqlcmd = @sqlcmd+@CityNameCondition
print @sqlcmd;
exec sp_executesql @sqlcmd
if @@error <> 0
begin
select @Ret = -1, @Reason = N'T-SQL DML命令执行时错误';
end
select @Ret as ret, @Reason as failreason;
return @Ret;
go
2、VC6.0代码中与数据库SQL Server2005采用ODBC方式,
调用存储过程代码如下:
前面连接数据库就省略不写了,直接写如何调用存储过程:
//.....连接数据库过程省略
SQLRETURN hRecode;
SQLINTEGER CbSatid = SQL_NTS;
//执行SQL命令
hRecode = SQLExecDirect(m_hstmt, (UCHAR*)"exec p_QueryCity ''", SQL_NTS);
if ( (hRecode != SQL_SUCCESS) && (hRecode != SQL_SUCCESS_WITH_INFO) )
{
return;
}
//获取结果集
while ( hRecode = SQLFetch(m_hstmt ) != SQL_NO_DATA_FOUND)
{
//此时已经有问题了,下面的SQLGetData也不会取到任何数据,
//此时调用SQLError函数获取到SqlState = 24000,ErrorMsg = [Microsoft][ODBC SQL Server Driver]无效的游标状态
char szCity[100] = {0};
char CityNameDesp[100] = {0};
char CityLoc[100] = {0};
SQLGetData(m_hstmt, 1, SQL_C_TCHAR, szCity, 99, &CbSatid);
SQLGetData(m_hstmt, 2, SQL_C_TCHAR, CityNameDesp, 99, &CbSatid);
SQLGetData(m_hstmt, 3, SQL_C_TCHAR, CityLoc, 99, &CbSatid);
}
3、后来对数据库存储过程修改为如下:
if exists(select * from sys.objects where object_id = OBJECT_ID('dbo.p_QueryCity') and type = 'P')
drop procedure dbo.p_QueryCity;
go
Create Procedure dbo.p_QueryCity
@CityName nvarchar(50)
as
declare @Ret int,@Reason nvarchar(max);
select @Ret = 0,@Reason = N'';
select
CityName
,CityNameDesp
,CityLoc
from CityTable where 1 = 1 and (@CityName is null or @CityName = '' or CityName = @CityName);
if @@error <> 0
begin
select @Ret = -1, @Reason = N'T-SQL DML命令执行时错误';
end
select @Ret as ret, @Reason as failreason;
return @Ret;
go
4、重新执行步骤2中的代码,可以正常获取到数据,各位大侠能告诉小弟是什么原因????
...全文
相关推荐
VC ADO调用存储过程
关于ADO调用存储过程的标准的做法:按照以下步骤进行: 1、生成并初始化一个_CommandPtr对象; 2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象; 3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数); 4、为_CommandPtr对象指定需要使用的ADO连接等; 5、使用_CommandPtr的Execute方法调用存储过程; 6、从结果中获取返回参数的值(如果有的话)。
VC++/Delphi编写动态连接库 含测试用例 C#调用VC++/Delphi DLL(含源代码和部分注释)
VC++/Delphi编写动态连接库 含测试用例 C#调用VC++/Delphi DLL(含源代码) 小巧可用,源码已经调试通过,含部分注释 适合dll编程的入门人员 有不住之处,希望各位海涵!
SQL存储过程调用动态链接库
主要简单介绍动态链接库,用SQL存储过程来调用他,同时给出了实例,请大家来斧正.
vc调用dev-c++动态链接库dll示例
描述了如何从vc中调用dev-c++写的dll的过程与方法。 1、设置导出关键字__stdcall 2、修改vc调用方式为stdcall 3、实现函数调用call
vb调用vc动态连接库总结
vb调用vc动态连接库总结,vb调用vc动态连接库总结



