vc调用mssql存储过程问题

时间:2022-05-03 14:05:48
问题:
在MSSQL中写了三个带参数的存储过程,其中的代码和传进去的参数一样,只不过是数据库名和字段不同,功能是把前一天部分数据更新到今天.
在MSSQL中直接EXEC这三个存储过程没任何问题.
用VC调用的时候.其中一个数据量小点的可以成功,数据量大点的出现#3092的错误,单步调试时出错是#3121
不知怎么解决了..
下面是部分代码..

//----调用三个存储过程----
void CSap_etlDlg::FucForStoredProc()
{
char sz_msg[256] = {0};
char sz_format[16] = {0};

struct tm *p = NULL;
p = gmtime(&g_to_time);
_snprintf(sz_format, sizeof(sz_format) - 1, "%04d-%02d-%02d", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday);

m_ClassCadom.ExecStoredProc(sz_Store_Proc_DailyTrade, sz_format);
m_ClassCadom.ExecStoredProc(sz_Store_Proc_DailyChart, sz_format);
m_ClassCadom.ExecStoredProc(sz_Store_Proc_DailyBalance, sz_format);
}

//----存储过程函数----
// _ConnectionPtr      m_pADOCon;
// _CommandPtr m_pADOCmd;
// _RecordsetPtr       m_pADORec;
//----pStoreName: 存储过程名,pParameter参数,参数格式是: 2014-04-04 
bool CAdoModule::ExecStoredProc(const char* pStoreName, char *pParameter)
{
char sz_msg[256] = {0};
char sz_buf[128] = {0};

try
{
_variant_t RecordsAffected;
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND; //定义为无参数
m_pADOCmd->ActiveConnection = m_pADOCon; //非常关键的一句,将建立的连接赋值给它
m_pADOCmd->CommandType = adCmdStoredProc;

//----增加输入参数----
if (NULL != pParameter)
{
_ParameterPtr ptr1;
ptr1 = m_pADOCmd->CreateParameter("@valuedate", adVarChar, adParamInput, 10, _variant_t(pParameter)) ;
m_pADOCmd->Parameters->Append(ptr1); 
}

m_pADOCmd->CommandText = _bstr_t(pStoreName);//命令字串

m_pADORec = m_pADOCmd->Execute(&vNULL, &vNULL, adCmdStoredProc); 
}
catch (::_com_error e)
{
_snprintf(sz_msg, sizeof(sz_msg) - 1, "ExecStoredProc error :%s", e.ErrorMessage());
p_MainCwnd->SendMessage(MSG_INFO, 0, (LPARAM)sz_msg);
return false;
}

return true;
}

//----部分存储过程,因为存储过程没有问题,只贴出开头带参数部分
CREATE PROCEDURE [dbo].[proc_update_predata_for_dailytrade] 
  @value_date date
  
AS
BEGIN
if (@value_date is null) 
begin
set @value_date = getdate()
end

declare @diffday int, @report_date int
set @diffday = 1;
set @report_date = convert(int, convert(varchar,@value_date,112))

5 个解决方案

#1


异常捕获改成这样看是什么错误
[code=C/C++]try
{
//你的ADO代码
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s"), 
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

#2


lz代码里不是有打印了错误信息了吗?看看错误信息说了什么错误啊

但是你这个_snprintf(sz_msg, sizeof(sz_msg) - 1, "ExecStoredProc error :%s", e.ErrorMessage());有运行到吗?

#3


有运行到.
自动运行时是#3092的错误,单步调试出错是#3121

#4


没人有见到过这个问题吗?

#5


你存储过程是时间参数,最大只有8长,你传的是字符,
我觉得你可以传存储过程可以传字符串,在存储过程中转成时间。

#1


异常捕获改成这样看是什么错误
[code=C/C++]try
{
//你的ADO代码
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s"), 
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

#2


lz代码里不是有打印了错误信息了吗?看看错误信息说了什么错误啊

但是你这个_snprintf(sz_msg, sizeof(sz_msg) - 1, "ExecStoredProc error :%s", e.ErrorMessage());有运行到吗?

#3


有运行到.
自动运行时是#3092的错误,单步调试出错是#3121

#4


没人有见到过这个问题吗?

#5


你存储过程是时间参数,最大只有8长,你传的是字符,
我觉得你可以传存储过程可以传字符串,在存储过程中转成时间。