有关存储过程的出现的常见错误

作者:blacet的学习点滴  发布日期:2012-04-11 20:13:41
//从数据源导入的MFC的ODBC类,通过存储过程和数据库中的表绑定
CSpDEPART::CSpDEPART(CDatabase* pdb)
: CRecordset(pdb)
{
	m_departCount = 0;  //3个查询输出的列
	m_DepartID = 0;
	m_DEPARTDESC = "";
	m_nFields = 3;      //绑定查询输出的列的个数,必须要的,如果没有返回列这不需要,但是要在这个类中重载move函数的如下注释掉的部分
	//if (m_nFields <= 0)
	//{
	//	m_bEOF = m_bBOF = TRUE;让头和尾相等
	//	return;
	//}

	m_queryMode = 1;				//两个输入参数 
	m_queryID = 0;m_lReturnValue = -1; //1个输出的返回参数,好像是必有的
	m_nParams = 3;					//总共的参数个数 = 输入的个数+输出的个数 
	m_nDefaultType = dynaset;
}
//#error Security Issue: The connection string may contain a password //这行要注销掉,提示的是安全问题,这里不需要
// 此连接字符串中可能包含明文密码和/或其他重要
// 信息。请在查看完此连接字符串并找到所有与安全
// 有关的问题后移除 #error。可能需要将此密码存
// 储为其他格式或使用其他的用户身份验证。

CString CSpDEPART::GetDefaultConnect()
{
	return _T("DSN=MyDataBase;uid=sa;pwd=123456"); //和数据库连接
}

CString CSpDEPART::GetDefaultSQL()
{
	return _T("{? = CALL query_departnameNew(?,?)}"); //绑定存储过程
}
void CSpDEPART::DoFieldExchange(CFieldExchange* pFX)
{
	pFX->SetFieldType(CFieldExchange::outputParam);  //绑定1个输出为返回值的参数
	RFX_Long(pFX, _T("@return_value"), m_lReturnValue);

	pFX->SetFieldType(CFieldExchange::inputParam);  //绑定2个存储过程的输入参数
	RFX_Long(pFX, _T("[@departid]"), m_queryID);
	RFX_Long(pFX, _T("[@querymode]"), m_queryMode);

    //绑定3个存储过程的查询输出参数,DEPARTCOUNT ,DEPARTID,DEPARTDESC,绑定顺序不能错了
	pFX->SetFieldType(CFieldExchange::outputColumn);
	RFX_Int(pFX, _T("[DEPARTCOUNT]"), m_departCount);
	RFX_Long(pFX, _T("[DEPARTID]"), m_DepartID);
	RFX_Text(pFX, _T("[DEPARTDESC]"), m_DEPARTDESC);
}

--存储过程如下:
CREATE PROCEDURE [dbo].[query_departnameNew] (@departid  as int  ,@querymode as int)

AS
DECLARE @departcount as smallint

if @querymode =1
    begin
	SELECT @departcount=COUNT(*) FROM DEPART

	SELECT @departcount as DEPARTCOUNT ,DEPARTID,DEPARTDESC FROM DEPART  --绑定时的顺序从前向后,与上文的绑定顺序一致
    end
Tag标签: 存储过程  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规