2012-09-26 45 views
0

正如我在標題中所說的,問題是.net程序中oracle的參數爲null,雖然這個參數是在pl/sql測試中分配的。 Out參數數據類型是nvarchar2。我試圖將此值更改爲int,並且運行良好。但我需要從程序中返回文本!什麼是問題?順便說一句,我使用Oracle.DataAccess.Client; 下面是代碼:在.net中無法跳出Oracle的參數

private void OKButton_Click(object sender, EventArgs e) 
{ 
    float cur_rate; 
    decimal value; 
    if (!String.IsNullOrEmpty(RateTxtBox.Text) && decimal.TryParse(RateTxtBox.Text, out value)) 
    { 
    cur_rate = float.Parse(RateTxtBox.Text); 
    con = new OracleConnection(conStr); 
    con.Open(); 
    cmd = con.CreateCommand(); 
    cmd.BindByName = true; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = schema_name + ".CACCRUEMENT_INS"; 
    cmd.Parameters.Add("p_check_info_id", OracleDbType.Int32, header_id, ParameterDirection.Input); 
    cmd.Parameters.Add("p_calculate_on", OracleDbType.Date, DateTime.Parse(dateTimePicker1.Text), ParameterDirection.Input); 
    cmd.Parameters.Add("p_curr_id", OracleDbType.Decimal, CurrencyCombobox.SelectedValue, ParameterDirection.Input); 
    cmd.Parameters.Add("p_cur_rate", OracleDbType.Decimal, Decimal.Parse(RateTxtBox.Text), ParameterDirection.Input); 
    cmd.Parameters.Add("p_result", OracleDbType.NVarchar2).Direction = ParameterDirection.Output; 
    //cmd.Parameters.Add("p_result", OracleDbType.NVarchar2,ParameterDirection.Output); 
    cmd.ExecuteNonQuery(); 
    string result = cmd.Parameters["p_result"].Value.ToString(); 
    MessageBox.Show(result); 
    Thread.Sleep(2); 
    this.Close(); 
    } 
    else 
    { 
     MessageBox.Show("Invalid data format!"); 
    } 
} 

PL/SQL precedure:

所有的
create or replace procedure CACCRUEMENT_INS(
p_check_info_id in number, 
p_calculate_on in date, 
p_curr_id in number, 
p_cur_rate in number, 
p_result out varchar2 
) is 

v_Accruemtnt number; 
v_rate number; 
v_cur_rate_in_check_info number; 
Last_accruemet_date date; 
monthes_bwn_last_adj_n_chck number; 
next_check date; 
check_info_rate number; 
begin 
select c.next_check 
into next_check 
from check_info c 
where c.id_check_info = p_check_info_id; 
begin 
    select max(c.calculate_on) 
    into Last_accruemet_date 
    from Caccruement c 
    where c.fk_check_info = p_check_info_id 
    group by c.fk_check_info; 
    exception when no_data_found then 
    begin 
    select max(c.calculate_on_date) 
    into Last_accruemet_date 
    from check_info_lines c 
    where c.fk_check_info = p_check_info_id 
    group by c.fk_check_info; 
    exception when no_data_found then 
    p_result:='Adjustment is not calculated!'; 
    goto l_EndOfLoop; 
    end; 
end; 
select ci.curency_rate 
into check_info_rate from check_info ci where ci.id_check_info = p_check_info_id; 
select c.rate 
into v_rate 
from Check_Info c 
where c.id_check_info = p_check_info_id; 
monthes_bwn_last_adj_n_chck:=MONTHS_BETWEEN(next_check,Last_accruemet_date); 
IF(monthes_bwn_last_adj_n_chck>round(MONTHS_BETWEEN(p_calculate_on,Last_accruemet_date),3)) 
THEN 
    select c.curency_rate 
    into v_cur_rate_in_check_info 
    from check_info c 
    where c.id_check_info = p_check_info_id; 
    --v_rate:=round((v_rate/v_cur_rate_in_check_info),3); 
v_Accruemtnt := round(v_rate/check_info_rate * MONTHS_BETWEEN(p_calculate_on, Last_accruemet_date)*p_cur_rate,3) ; 
insert 
into CAccruement(Id_Accruemtnt,Calculate_On,Accruemtnt,Fk_Check_Info,Cu_Id,Cu_Rate,Calculation_Date,Accruemtnt_Kzt) 
values (accruement_seq.nextval,p_calculate_on,round(v_Accruemtnt/p_cur_rate,3),p_check_info_id,p_curr_id,p_cur_rate,Sysdate,v_Accruemtnt); 
update check_info c 
set c.total_accumulated = c.total_accumulated+v_Accruemtnt 
where c.id_check_info = p_check_info_id; 
END IF; 
COMMIT; 
p_result:='Operation complited successfully'; 
update_total_accumulated(p_check_info_id); 
<<l_EndOfLoop>> 
    ROLLBACK; 
    EXCEPTION 
WHEN OTHERS 
THEN 
    DBMS_OUTPUT.PUT_LINE(SQLERRM); 
    ROLLBACK;  
end CACCRUEMENT_INS; 

回答

0
  • 首先嚐試使用DB型Varchar2代替NVarchar2

    例。

 

    cmd.Parameters.Add("p_result", OracleDbType.NVarchar2,ParameterDirection.Output); 

  • 其次,如果你還沒有得到的值在下面試圖把它找回來
 

    var value = cmd.Parameters["p_result"].Value; 
    var str = (OracleString) value; 
    str.Value; //This is the string 

+0

拋出OracleNullValue Excaption上最後一行。 – Nate

+0

好吧也許它是空的。您可以嘗試在過程的開始時將值分配給p_result變量嗎? 除此之外,當使用像** max **這樣的組函數時,您將永遠不會得到no_data_found異常。 – Laggel