Frage

Wir haben einen ASP.NET-Webdienst, der eine gespeicherte Prozedur auf der DB (Oracle 11g) aufruft. Das Problem ist, dass der Aufruf der Prozedur bläst jedes Mal eine leere Zeichenfolge, wird als einer der Parameter übergibt. Wir sehen eine ORA-01084 Fehler, der mir zeigt, dass Anruf vor versagt die Prozedur tatsächlich ausgeführt werden.

Hier ist das Verfahren, minus einig Logik, dass ich glaube, ist nicht relevant:

PROCEDURE CreateReport
( 
  from_dt IN NVARCHAR2,
  to_dt IN NVARCHAR2,
  p_table_id   IN NVARCHAR2,
  p_column_id  IN NVARCHAR2,
  device_name IN NVARCHAR2,
  ret_cursor OUT t_cursor
)
AS
  v_cursor t_cursor;
  dateStr NVARCHAR2(200);
  sqlStmt VARCHAR2(10000);
  extraColumns NVARCHAR2(10000);
BEGIN

    /* SNIP Cut logic that builds the query statement based on inputs */

    OPEN v_cursor FOR sqlStmt;
    ret_cursor := v_cursor;

END CreateReport;

Hier ist der Aufruf von CreateReport aus dem Web-Service:

public DataSet CreateReport(string fromDt, string toDate, string tableNames, 
                            string columnNames, string deviceName)
{
    DataSet dataSet;

    string fmDateStr = String.IsNullOrEmpty(fromDt) ? String.Empty : fromDt.Trim();
    string toDateStr = String.IsNullOrEmpty(toDate) ? String.Empty : toDate.Trim();

    OracleCommand oleDBCmd = new OracleCommand();

    oleDBCmd.CommandType = CommandType.StoredProcedure;
    oleDBCmd.CommandText = "Web_Pkg.CreateReport";

    oleDBCmd.Parameters.Add(new OracleParameter("from_dt", OracleType.NVarChar));
    oleDBCmd.Parameters["from_dt"].Value = fmDateStr;
    oleDBCmd.Parameters["from_dt"].Direction = ParameterDirection.Input;

    oleDBCmd.Parameters.Add(new OracleParameter("to_dt", OracleType.NVarChar));
    oleDBCmd.Parameters["to_dt"].Value = toDateStr;
    oleDBCmd.Parameters["to_dt"].Direction = ParameterDirection.Input;

    oleDBCmd.Parameters.Add(new OracleParameter("p_table_id", OracleType.NVarChar));
    oleDBCmd.Parameters["p_table_id"].Value = tableNames;
    oleDBCmd.Parameters["p_table_id"].Direction = ParameterDirection.Input;

    oleDBCmd.Parameters.Add(new OracleParameter("p_column_id", OracleType.LongVarChar));
    oleDBCmd.Parameters["p_column_id"].Value = columnNames;
    oleDBCmd.Parameters["p_column_id"].Direction = ParameterDirection.Input;

    oleDBCmd.Parameters.Add(new OracleParameter("device_name", OracleType.LongVarChar));
    oleDBCmd.Parameters["device_name"].Value = deviceName;
    oleDBCmd.Parameters["device_name"].Direction = ParameterDirection.Input;


    oleDBCmd.Parameters.Add(new OracleParameter("ret_cursor", OracleType.Cursor));
    oleDBCmd.Parameters["ret_cursor"].Direction = ParameterDirection.Output;

    try
    {
        // Throws exception if any of the paramters are String.Emtpy
        dataSet = DB.SQLSelect(oleDBCmd, connStr);
    }
    catch (Exception exp)
    {
        return null;
    }
    finally
    {
        if (oleDBCmd != null)
        {
            oleDBCmd.Dispose();
        }
    }

    return dataSet;
}

Als Experiment modifizierte ich die Web-Service-null anstatt einer leeren Saiten zu übergeben. Wenn null in übergeben wird, sehe ich einen Fehler anzeigt „falsche Anzahl oder Arten von Argumenten in Aufruf von‚Create.“

Ich habe auch versucht DBNull.Value vorbei, wenn die params waren null / leer, aber die in dem Fehler

resultierten

Parameter 'p_column_id': No size set for variable length data type: String.

(Natürlich p_column_id war der leere Parameter in diesem Fall).

Also, wie kann ich passieren erfolgreich leere Strings als Parameter an meine gespeicherten Prozedur? Wir wollen auf jeden Fall die p_column_id Parameter erlauben, leer zu sein.

War es hilfreich?

Lösung

Sie können die folgenden für alle auf NULL festlegbare Parameter tun.

oleDBCmd.Parameters.Add(new OracleParameter("to_dt", OracleType.NVarChar));
if(string.IsNullOrEmpty(toDateStr)) {
    oleDBCmd.Parameters["to_dt"].Value = DBNull.Value;
} else {
    oleDBCmd.Parameters["to_dt"].Value = toDateStr;
}
oleDBCmd.Parameters["to_dt"].Direction = ParameterDirection.Input;

Auf diese Weise sind Sie nicht auf Zeichenfolge zu verlassen. -> null Umwandlung durch den Oracle-Adapter

Edit: Wenn dies das Problem nicht beheben, ist es sehr wahrscheinlich eine Diskrepanz zwischen den Typen, überprüft NVarChar vs VarChar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top