Hi,
For the last few days I’m trying to call a stored procedure within a c++ recordset.
The issue arise when I’m passing CLongBinary field threw that recordset, and then I get: ‘count field incorrect or syntax error’.
Attaching cpp recordset code for your review:
sp_insertSesMessageStore::sp_insertSesMessageStore(CDatabase* pdb)
: CRecordset(pdb)
{
// Param Init
m_RETURN_VALUE = -1;
m_PROVIDER_IDParam = _T("");
m_BRANCH_IDParam = _T("");
m_ACCOUNTParam = _T("");
m_SES_USER_UNIQUE_IDParam = _T("");
m_DISPLAY_NAMEParam = _T("");
m_SMTP_ADDRESSParam = _T("");
m_MESSAGE_TYPE_IDParam = 0;
m_PRIORITYParam = 0;
m_SUBJECTParam = _T("");
m_SUMMARYParam = _T("");
m_TEMPLATE_IDParam = _T("");
m_BODY_TYPE_IDParam = 0;
m_TRACKING_IDParam = _T("");
m_EXPIRATION_TIMEParam = _T("");
m_SUBCATEGORY_IDParam = 0;
m_FOLDER_IDParam = 0;
m_NUM_ATTACHMENTSParam = 0;
m_ACCESS_IDParam = _T("");
m_FLAGSParam = 0;
m_FAVORITEParam = FALSE;
m_CERTIFIED_IDParam = _T("");
m_SECURE_RESPONSE_OTPParam = _T("");
m_MESSAGE_IDParam = _T("");
m_nParams = 24;
m_nDefaultType = snapshot;
}
CString sp_insertSesMessageStore::GetDefaultConnect()
{
return "";//ODBC_DSN_INFO;
}
CString sp_insertSesMessageStore::GetDefaultSQL()
{
return _T("{CALL sp_insertSesMessageStore (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
}
void sp_insertSesMessageStore::DoFieldExchange(CFieldExchange* pFX)
{
// RFX input param mapping
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("[@PROVIDER_ID]"), m_PROVIDER_IDParam, 3);
RFX_Text(pFX, _T("[@BRANCH_ID]"), m_BRANCH_IDParam, 50);
RFX_Text(pFX, _T("[@ACCOUNT]"), m_ACCOUNTParam, 255);
RFX_Text(pFX, _T("[@SES_USER_UNIQUE_ID]"), m_SES_USER_UNIQUE_IDParam, 8);
RFX_Text(pFX, _T("[@DISPLAY_NAME]"), m_DISPLAY_NAMEParam, 255);
RFX_Text(pFX, _T("[@SMTP_ADDRESS]"), m_SMTP_ADDRESSParam, 255);
RFX_Int(pFX, _T("[@MESSAGE_TYPE_ID]"), m_MESSAGE_TYPE_IDParam);
RFX_Byte(pFX, _T("[@PRIORITY]"), m_PRIORITYParam);
RFX_Text(pFX, _T("[@SUBJECT]"), m_SUBJECTParam, 255);
RFX_Text(pFX, _T("[@SUMMARY]"), m_SUMMARYParam, 255);
RFX_Text(pFX, _T("[@TEMPLATE_ID]"), m_TEMPLATE_IDParam, 255);
RFX_Int(pFX, _T("[@BODY_TYPE_ID]"), m_BODY_TYPE_IDParam);
RFX_Text(pFX, _T("[@TRACKING_ID]"), m_TRACKING_IDParam, 255);
RFX_Text(pFX, _T("[@EXPIRATION_TIME]"), m_EXPIRATION_TIMEParam, 16);
RFX_Int(pFX, _T("[@SUBCATEGORY_ID]"), m_SUBCATEGORY_IDParam);
RFX_Int(pFX, _T("[@FOLDER_ID]"), m_FOLDER_IDParam);
RFX_Int(pFX, _T("[@NUM_ATTACHMENTS]"), m_NUM_ATTACHMENTSParam);
RFX_LongBinary(pFX, _T("[@BODY]"), m_BODYParam);
RFX_Text(pFX, _T("[@ACCESS_ID]"), m_ACCESS_IDParam, 255);
RFX_Long(pFX, _T("[@FLAGS]"), m_FLAGSParam);
RFX_Bool(pFX, _T("[@FAVORITE]"), m_FAVORITEParam);
RFX_Text(pFX, _T("[@CERTIFIED_ID]"), m_CERTIFIED_IDParam, 100);
RFX_Text(pFX, _T("[@SECURE_RESPONSE_OTP]"), m_SECURE_RESPONSE_OTPParam, 50);
//// RFX input_output param mapping
pFX->SetFieldType(CFieldExchange::inoutParam);
RFX_Text(pFX, _T("[@MESSAGE_ID]"), m_MESSAGE_IDParam, 8);
}
void sp_insertSesMessageStore::Move(long lRows, WORD wFetchType)
{
m_bBOF = m_bEOF = TRUE; // By pass CRecordset
}
BOOL sp_insertSesMessageStore::ExecDirect()
{
return Open(CRecordset::forwardOnly, NULL, CRecordset::executeDirect);
}
I’m using ExecDirect to call the stored procedure.
Is it even possible to pass the CLongBinary to a stored procedure?! If yes what am I doing wrong?
If not what are my alternatives?
Attaching the stored procedure code:
CREATE PROCEDURE sp_insertSesMessageStore
(
@PROVIDER_ID char(3),
@BRANCH_ID varchar(50),
@ACCOUNT varchar(255),
@SES_USER_UNIQUE_ID bigint,
@DISPLAY_NAME varchar(255),
@SMTP_ADDRESS varchar(255),
@MESSAGE_TYPE_ID smallint,
@PRIORITY tinyint,
@SUBJECT varchar(255),
@SUMMARY varchar(255),
@TEMPLATE_ID varchar(255),
@BODY_TYPE_ID smallint,
@TRACKING_ID varchar(255),
@EXPIRATION_TIME datetime,
@SUBCATEGORY_ID smallint,
@FOLDER_ID smallint,
@NUM_ATTACHMENTS smallint,
@BODY varbinary(max),
@ACCESS_ID varchar(255),
@FLAGS int,
@FAVORITE bit,
@CERTIFIED_ID varchar(100),
@SECURE_RESPONSE_OTP varchar(50),
@MESSAGE_ID bigint output
)
as
begin
select @MESSAGE_ID= max(MESSAGE_ID)+1 from SES_MessageStore
IF @MESSAGE_ID is null
BEGIN
set @MESSAGE_ID = 1
END
insert into SES_MessageStore values(@MESSAGE_ID,'',@PROVIDER_ID,@BRANCH_ID,@ACCOUNT,
@SES_USER_UNIQUE_ID,@DISPLAY_NAME,@SMTP_ADDRESS,@MESSAGE_TYPE_ID,@PRIORITY,
@SUBJECT,@SUMMARY,@TEMPLATE_ID,@BODY_TYPE_ID,@TRACKING_ID,@EXPIRATION_TIME,
@SUBCATEGORY_ID,@FOLDER_ID,@NUM_ATTACHMENTS,@BODY,
@ACCESS_ID,@FLAGS,@FAVORITE,@CERTIFIED_ID,@SECURE_RESPONSE_OTP)
End
I’m using ODBC driver for sql server 6.01.7601.17514
SQL server 2008 r2.
Thanks in advance,
Willy.