Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从asp.net向Oracle存储过程传递空/空字符串_Asp.net_Oracle_Stored Procedures_Null_Dbnull - Fatal编程技术网

从asp.net向Oracle存储过程传递空/空字符串

从asp.net向Oracle存储过程传递空/空字符串,asp.net,oracle,stored-procedures,null,dbnull,Asp.net,Oracle,Stored Procedures,Null,Dbnull,我们有一个ASP.NET web服务,它调用数据库(Oracle11g)上的存储过程。问题是,每次将空字符串作为参数之一传递时,对过程的调用都会中断。我们看到一个错误,它向我表明,在过程实际运行之前,调用失败了 以下是程序,减去一些我认为不相关的逻辑: PROCEDURE CreateReport ( from_dt IN NVARCHAR2, to_dt IN NVARCHAR2, p_table_id IN NVARCHAR2, p_column_id IN NVAR

我们有一个ASP.NET web服务,它调用数据库(Oracle11g)上的存储过程。问题是,每次将空字符串作为参数之一传递时,对过程的调用都会中断。我们看到一个错误,它向我表明,在过程实际运行之前,调用失败了

以下是程序,减去一些我认为不相关的逻辑:

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;
下面是从web服务调用
CreateReport

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;
}
作为一个实验,我修改了web服务以传递
null
,而不是空字符串。传入
null
时,我看到一个错误,指示“调用'CREATEREPORT'时参数的数量或类型错误。”

我还尝试在参数为null/空时传递
DBNull.Value
,但这导致了错误

参数'p\u column\u id':没有为可变长度数据类型设置大小:String。

(当然,在本例中,p_column_id是空参数)


那么,如何成功地将空字符串作为参数传递给存储过程呢?我们当然希望允许p_column_id参数为空。

您可以对任何可为空的参数执行以下操作

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;
这样,您就不再依赖oracle适配器的字符串->空转换


编辑:如果这不能解决问题,很可能是类型之间不匹配,请检查NVarChar vs VarChar

对于任何可为空的参数,您可以执行以下操作

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;
这样,您就不再依赖oracle适配器的字符串->空转换


编辑:如果这不能解决问题,则很可能是类型之间不匹配,请检查NVarChar vs VarChar

这确实是类型不匹配。设备名称和p列id参数在web服务中使用的类型不正确。它们是OracleType.LongVarChar,但它们应该是OracleType.NVarChar。谢谢这确实是一种类型不匹配。设备名称和p列id参数在web服务中使用的类型不正确。它们是OracleType.LongVarChar,但它们应该是OracleType.NVarChar。谢谢