2012-08-29 23 views
6

Wołam procedura składowana za pośrednictwem bezpośredniego SQL z X ++ i nie mogę dowiedzieć się, jak uzyskać z niego wartość zwracaną przez liczbę całkowitą. 0 jest dobre, -1 jest złe.Jak uzyskać wyniki bezpośredniego wywołania SQL do procedury składowanej?

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

Czy próbujesz ustalić, czy są jakieś rekordy? –

+0

Mówię: "jeśli @status NOT IN (3,4,5) zwróci -1 - kwarantanna, otrzymano, zafakturowano", więc jeśli status jest zły, mogę przekazać kody błędów z powrotem. -2 nie znaleziono wiadomości e-mail lub coś takiego. –

Odpowiedz

5

executeUpdate zwraca zaktualizowaną liczbę wierszy; inaczej 0 dla instrukcji SQL, które nic nie zwracają.

Obiekt executeQuery zwraca instancję klasy ResultSet, ale wywołanie procedury składowanej nie jest wyborem, więc można przerwać umowę.

Co próbujesz zrobić, nie jest obsługiwane.

Możesz używać C# jako glue code lub używać typów C# bezpośrednio przy użyciu .NET CLR Interop.

+0

Ah. Zastanawiam się, czy mogę zrobić "SELECT (EXEC [...])" lub inne prace SQL wokół, aby uruchomić executeQuery. –

+0

Warto spróbować. –