Vorbei Null / leeren Zeichenfolge Oracle gespeicherte Prozedur von asp.net
-
23-09-2019 - |
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
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.
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