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?
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. –