2010-03-01 8 views
1

DB (Oracle 11g)에서 저장 프로 시저를 호출하는 ASP.NET 웹 서비스가 있습니다. 문제는 빈 문자열이 매개 변수 중 하나로 전달 될 때마다 프로 시저 호출이 끊어지는 것입니다. ORA-01084 오류가 표시됩니다.이 오류는 프로 시저가 실제로 실행되기 전에 호출이 실패했음을 나타냅니다. 여기 asp.net에서 Null/empty 문자열을 Oracle 저장 프로 시저에 전달

이 절차의 마이너스 내가 믿는 몇 가지 논리가되지 관련 : 여기
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의 호출입니다 :

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을 전달합니다. null이 전달되면 'CREATEREPORT'에 대한 호출에서 잘못된 숫자 또는 인수 유형을 나타내는 오류가 표시됩니다.

나는 또한 PARAMS가 비어/null로했다 때마다 DBNull.Value를 통과했지만, 그 오류

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

결과 (물론, p_column_id이 경우 빈 매개 변수를했다).

그럼 어떻게 빈 문자열을 매개 변수로 저장 프로 시저에 성공적으로 전달할 수 있습니까? 확실히 p_column_id 매개 변수를 비워 둘 수 있습니다.

답변

3

nullable 매개 변수에 대해 다음을 수행 할 수 있습니다.

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; 

그런 식으로 오라클 어댑터가 문자열 -> null 변환을 사용하지 않습니다.

편집 :이 문제가 해결되지 않는 경우,이 유형 사이에 불일치가 가장 가능성이있다 : VARCHAR

+0

대 NVARCHAR을 확인 그것은 참으로 형식이 일치했다. device_name 및 p_column_id 매개 변수가 웹 서비스에서 잘못된 유형을 사용 중입니다. 그것들은 OracleType.LongVarChar이지만 OracleType.NVarChar 여야합니다. 감사! – Odrade