2014-05-04 3 views
1

Je ne sais pas pourquoi mon code renvoie une erreur lorsqu'il est appelé à partir de VB, mais un code similaire dans PLSQL (Oracle) ne renvoie pas l'erreur.Appel de la fonction Oracle à partir de Visual Basic

Oracle Fonction:

CREATE OR REPLACE FUNCTION GET_CUST_STRING_FROM_DB (pcustid NUMBER) RETURN VARCHAR2 AS 
    returnstring VARCHAR2(200); 
    vcustomer customer%rowtype; 
BEGIN 
    SELECT * INTO vcustomer 
    FROM customer 
    WHERE custid = pcustid; 

    returnstring := 'CustID: ' || vcustomer.custid || ' Name: ' || vcustomer.custname || ' Status: ' || vcustomer.status || ' SalesYTD: ' || vcustomer.sales_ytd; 
    RETURN returnstring; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RAISE_APPLICATION_ERROR(-20021,'Error: Customer ID not found'); 
    WHEN OTHERS THEN 
     RAISE_APPLICATION_ERROR(-20000,SQLERRM); 
END; 
/

Oracle Call:

set serveroutput on; 

begin 
    dbms_output.put_line(get_cust_string_from_db(1)); 
end; 

Oracle Sortie:

Anonymous Block Completed 
CustID: 1 Name: Colin Smith Status: OK SalesYTD: 0 

Code VB:

Private Sub GetCustString() 
    Try 
     Dim connOracle As Oracle.DataAccess.Client.OracleConnection 
     Dim commOracle As New Oracle.DataAccess.Client.OracleCommand 
     Dim paramOracle As Oracle.DataAccess.Client.OracleParameter 

     connOracle = CreateConnection() 
     commOracle.Connection = connOracle 
     commOracle.CommandType = CommandType.StoredProcedure 
     commOracle.CommandText = "GET_CUST_STRING_FROM_DB" 

     paramOracle = New Oracle.DataAccess.Client.OracleParameter 
     paramOracle.ParameterName = "pcustid" 
     paramOracle.DbType = DbType.Int16 
     paramOracle.Value = tbGetCustStringCustID.Text 
     paramOracle.Direction = ParameterDirection.Input 
     commOracle.Parameters.Add(paramOracle) 

     paramOracle = New Oracle.DataAccess.Client.OracleParameter 
     paramOracle.ParameterName = "pReturnValue" 
     paramOracle.DbType = DbType.String 
     paramOracle.Direction = ParameterDirection.ReturnValue 
     commOracle.Parameters.Add(paramOracle) 

     lbOutput.Items.Add(commOracle.Parameters.Item("pcustid").Value) 
     lbOutput.Items.Add("--------------------------------------------") 
     lbOutput.Items.Add("Getting Details for CustID " & tbGetCustStringCustID.Text) 

     connOracle.Open() 
     commOracle.ExecuteNonQuery() 
     Dim vStr As String 
     vStr = commOracle.Parameters.Item("pReturnValue").Value.ToString 
     lbOutput.Items.Add(vStr) 
     connOracle.Close() 
    Catch ex As Exception 
     lbOutput.Items.Add(ex.Message) 
    End Try 
End Sub 

VB Sortie:

1 
----------------------------------------- 
Getting Details for CustID 1 
ORA-20021: Error: Customer ID not found 

donc je ne suis pas sûr de savoir pourquoi cela pourrait se produire. J'ai essayé d'attraper la valeur du paramètre et de m'assurer qu'il s'agissait d'un entier réel et non d'une chaîne. Le CustID 1 existe dans la base de données et est engagé.

Des idées?

Répondre

0

Vous devez spécifier la taille (max) de la valeur de retour, à savoir

paramOracle.Size = 200 
1

Outre la spécification ths taille de la valeur de retour, vous devez ajouter le paramètre de valeur de retour en premier ...

Private Sub GetCustString() 
    Try 
     Dim connOracle As Oracle.DataAccess.Client.OracleConnection 
     Dim commOracle As New Oracle.DataAccess.Client.OracleCommand 
     Dim paramOracle As Oracle.DataAccess.Client.OracleParameter 

     connOracle = CreateConnection() 
     commOracle.Connection = connOracle 
     commOracle.CommandType = CommandType.StoredProcedure 
     commOracle.CommandText = "GET_CUST_STRING_FROM_DB" 

     paramOracle = New Oracle.DataAccess.Client.OracleParameter 
     paramOracle.ParameterName = "pReturnValue" 
     paramOracle.DbType = DbType.String 
     paramOracle.Size = 200 
     paramOracle.Direction = ParameterDirection.ReturnValue 
     commOracle.Parameters.Add(paramOracle) 

     paramOracle = New Oracle.DataAccess.Client.OracleParameter 
     paramOracle.ParameterName = "pcustid" 
     paramOracle.DbType = DbType.Int16 
     paramOracle.Value = tbGetCustStringCustID.Text 
     paramOracle.Direction = ParameterDirection.Input 
     commOracle.Parameters.Add(paramOracle) 

     lbOutput.Items.Add(commOracle.Parameters.Item("pcustid").Value) 
     lbOutput.Items.Add("--------------------------------------------") 
     lbOutput.Items.Add("Getting Details for CustID " & tbGetCustStringCustID.Text) 

     connOracle.Open() 
     commOracle.ExecuteNonQuery() 
     Dim vStr As String 
     vStr = commOracle.Parameters.Item("pReturnValue").Value.ToString 
     lbOutput.Items.Add(vStr) 
     connOracle.Close() 
    Catch ex As Exception 
     lbOutput.Items.Add(ex.Message) 
    End Try 
End Sub 
+0

Merci @ Ciarán! L'ordre a de l'importance. Je viens d'apprendre quelque chose que je n'aurais jamais dû savoir. Soulagé ... mais un peu triste aussi. –

Questions connexes