代码之家  ›  专栏  ›  技术社区  ›  Odrade

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

  •  1
  • Odrade  · 技术社区  · 16 年前

    ORA-01084 错误,这向我表明调用在过程实际运行之前失败。

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

    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;
    

    以下是对 CreateReport 从web服务:

    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;
    }
    

    null 而不是空字符串。什么时候 无效的 传入时,我看到一个错误,指示“调用'CREATEREPORT'时参数的数目或类型错误。”

    我也试过传球 DBNull.Value 只要参数为null/empty,就会导致错误

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

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

    1 回复  |  直到 16 年前
        1
  •  4
  •   Joseph Yaduvanshi    16 年前

    可以对任何可为null的参数执行以下操作。

    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适配器进行的空转换。

    推荐文章