2012-08-29 8 views
6

Estoy llamando a un procedimiento almacenado a través de SQL directo desde X ++, y no puedo averiguar cómo obtener el valor entero de retorno de la misma. 0 es bueno, -1 es malo.¿Cómo obtener los resultados de una llamada SQL directa a un procedimiento almacenado?

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

¿Está tratando de determinar si hay algún registro? –

+0

Estoy diciendo 'if @status NOT IN (3,4,5) return -1 --Quarantine, Received, Invoiced' por lo que si se pasa un estado incorrecto, puedo volver a pasar los códigos de error. -2 sería correo electrónico no encontrado o algo así. –

Respuesta

5

El executeUpdate devuelve un conteo de filas actualizado; de lo contrario 0 para instrucciones SQL que no devuelven nada.

executeQuery devuelve una instancia de la clase ResultSet, pero llamar a un procedimiento almacenado no es una selección, por lo que se rompe el contrato.

Lo que está intentando hacer no es compatible.

Puede usar C# como glue code o usar los tipos C# directamente usando .NET CLR Interop.

+0

Ah. Me pregunto si puedo hacer un 'SELECT (EXEC [...])' o algún otro SQL para que el executeQuery funcione. –

+0

Vale la pena intentarlo. –

Cuestiones relacionadas