2012-08-29 16 views
6

Sto chiamando una procedura memorizzata tramite SQL diretto da X ++ e non riesco a capire come ottenere il valore di ritorno intero da esso. 0 è buono, -1 è cattivo.Come ottenere i risultati di una chiamata SQL diretta a una stored procedure?

// 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

Stai cercando di determinare se ci sono dei record? –

+0

Sto dicendo 'if @status NOT IN (3,4,5) restituisce -1 --Quarantine, Received, Invoiced' quindi se viene passato uno stato non corretto, posso passare indietro i codici di errore. -2 sarebbe email non trovata o qualcosa del genere. –

risposta

5

Il executeUpdate restituisce un numero di righe aggiornato; altrimenti 0 per istruzioni SQL che non restituiscono nulla.

Il executeQuery restituisce un'istanza della classe ResultSet, ma chiamare una stored procedure non è una selezione, quindi si interrompe il contratto.

Quello che stai cercando di fare non è supportato.

È possibile utilizzare C# come glue code oppure utilizzare i tipi C# direttamente utilizzando .NET CLR Interop.

+0

Ah. Mi chiedo se posso fare un 'SELECT (EXEC [...])' o qualche altro SQL per aggirare il funzionamento di executeQuery. –

+0

Vale la pena provare. –