2012-08-29 8 views
6

ich eine gespeicherte Prozedur über direkte SQL von X ++ aufrufen, und ich kann nicht herausfinden, wie die ganze Zahl Rückgabewert zu bekommen. 0 ist gut, -1 ist schlecht.Wie erhalten Sie die Ergebnisse eines direkten SQL-Aufrufs an eine gespeicherte Prozedur?

// Login to SQL DB 
loginProperty = new LoginProperty(); 
loginProperty.setServer('localhost'); 
loginProperty.setDatabase('SQL_DB'); 
odbcConnection = new OdbcConnection(loginProperty); 
statement = odbcConnection.createStatement(); 


/* 
@in_customer_id    INT 
,@status      INT 
,@dlvmode      NVARCHAR(25) 
,@dlvmodedesc     NVARCHAR(50) 
,@tracking_id     NVARCHAR(50) 
,@note       NVARCHAR(MAX) 
,@modified      SMALLDATETIME = null 
,@override_email    NVARCHAR(200) = null 
*/ 

sqlStatement = strfmt(' EXEC pr_send_status_email ' + 
         ' %1,'  + // CustomerId 
         ' %2,'  + // Status 
         ' %3,'  + // DlvMode 
         ' %4,'  + // DlvMode description 
         ' %5,'  + // Tracking # 
         ' %6,'  + // Note 
         ' %7'    // DateTime 
         , 160308 
         , 2 
         , sqlSystem.sqlLiteral("FD1") 
         , sqlSystem.sqlLiteral("Fed Ex overnight") 
         , sqlSystem.sqlLiteral("1ZABCDEF") 
         , sqlSystem.sqlLiteral("Note Here") 
         , sqlSystem.sqlLiteral(DateTimeUtil::utcNow())); 



sqlStatementExecutePermission = new SqlStatementExecutePermission(sqlStatement); 
sqlStatementExecutePermission.assert(); 
//BP deviation documented 
resultSet = statement.executeQuery(sqlStatement); 
//info(strfmt("%1", statement.executeUpdate(sqlStatement))); // I Tried this too 
CodeAccessPermission::revertAssert(); 

if (resultSet.next()) // Errors here 
    info(strfmt("Return: %1", resultSet.getInt(1))); 
+0

Versuchen Sie, wenn es zu bestimmen, sind alle Datensätze? –

+0

Ich sage 'wenn @status NICHT IN (3,4,5) -1 zurück --quarantine, Empfangene, Invoiced' also, wenn ein schlechter Zustand übergeben wird, ich Fehlercodes zurück passieren kann. -2 wäre E-Mail nicht gefunden oder etwas. –

Antwort

5

Die executeUpdate liefert eine aktualisierte Zeilenzählung; sonst 0 für SQL-Anweisungen, die nichts zurückgeben.

Die executeQuery gibt eine Instanz der Klasse ResultSet, sondern eine gespeicherte Prozedur aufrufen ist kein wählen, so dass Sie den Vertrag brechen.

Was Sie versuchen zu tun ist, nicht unterstützt.

Sie können C# als glue code verwenden oder die C# -Typen direkt mit .NET CLR Interop verwenden.

+0

Ah. Ich frage mich, ob ich tun kann, eine SELECT (EXEC [...]) 'oder eine andere SQL arbeitet rund um die executeQuery Arbeit zu bekommen. –

+0

Es ist einen Versuch wert. –