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;
拋出OracleNullValue Excaption上最後一行。 – Nate
好吧也許它是空的。您可以嘗試在過程的開始時將值分配給p_result變量嗎? 除此之外,當使用像** max **這樣的組函數時,您將永遠不會得到no_data_found異常。 – Laggel