2009-07-24 3 views
0

Ich versuche, eine gespeicherte Prozedur auf SQL Server von einem MFC-basierten C++ - Programm auszuführen. Die gespeicherte Prozedur wird ordnungsgemäß ausgeführt, aber in meinem Programm wird eine Ausnahme ausgelöst, eine CDBException mit einer Nachricht von "Function sequence error". Wenn Sie den MFC-Quellcode für CRecordset :: Open durchsuchen, wird die Ausnahme von MoveNext ausgelöst. Dies ist sinnvoll, da meine gespeicherte Prozedur keine Ausgabe generiert.Wie Stored Procedure ohne Ausnahme von CRecordset :: Open ausgeführt wird ausgeführt werden?

habe ich sowohl Ein- und Ausgangsparameter an die gespeicherte Prozedur, so kann ich nicht CDatabase :: ExecuteSQL wie in dieser Frage vorgeschlagen: With CDatabase, can I send SQL without using CRecordSet?

+1

auf Ihre Punktzahl Sehen, könnte meinen Vorschlag dumm klingen. Sie können die gespeicherte Prozedur ändern, um 1 zurückzugeben (d. H. SELECT 1 am Ende). – shahkalpesh

+0

Ich weiß nicht, ob das funktioniert. Aber du könntest den Aufruf von SP mit SELECT 1 kombinieren (z. B. mystoredproc @x, @y; SELECT 1) – shahkalpesh

+1

@shahkalpesh - nicht so blöd, wenn du es als Antwort gelassen hättest, hätte ich ihm einen Upvote gegeben. Und lassen Sie sich nicht durch die Rechnung irreführen, ich wette, es gibt sogar ein paar Dinge, die Jon Skeet nicht kennt. –

Antwort

0

Ich kam schließlich mit einem Hack, um das Problem zu beheben, Ich konnte nicht auf SO warten um eine Antwort zu geben. Ich hatte das Problem bereits zu CRecordSet :: MoveNext verfolgt, das sofort CRecordset :: Move aufruft. Was ich nicht sofort erkannte, ist, dass Move als virtuell deklariert wird, also ist es möglich, es mit meiner eigenen Version zu umgehen.

void CMyRecordset::Move(long nRows, WORD wFetchType) 
{ 
    (void) nRows; 
    (void) wFetchType; 
    m_bEOF = true; 
}