2014-02-20 40 views
6

我試圖執行一些oracle和pl/sql過程與輸入和輸出參數從#asp.net上的代碼。我想從out參數中檢索值。但是當我執行我得到一個oracle異常,如「ORA-06502:PL/SQL:數字或值錯誤:字符串緩衝區太小」。我現在可以做什麼?請幫幫我。ORA-06502:PL/SQL:數值或值的錯誤:字符串緩衝區太小的異常從C#代碼

代碼:

using Oracle.DataAccess.Client; 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Activity.Account 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      SuccessLabel.Visible = false; 
      FailureLabel.Visible = false; 
     } 

     protected void Create_user(object sender, EventArgs e) 
     { 
      var id=""; 
      string oradb = "Data Source=OracleServerHost;User ID=scott;password=tiger"; 
      using (OracleConnection conn = new OracleConnection(oradb)) 
      { 
       try 
       { 
        OracleCommand cmd = new OracleCommand(); 
        cmd.Connection = conn; 
        cmd.CommandText = "create_users_372640"; 
        cmd.CommandType = CommandType.StoredProcedure; 
        OracleParameter p1 = new OracleParameter("u_user_id", UserIDTextBox.Text.TrimEnd()); 
        OracleParameter p2 = new OracleParameter("u_First", FirstNameTextBox.Text.TrimEnd()); 
        OracleParameter p3 = new OracleParameter("u_Last", LastNameTextBox.Text.TrimEnd()); 
        OracleParameter p4 = new OracleParameter("u_Email", EmailIDTextBox.Text.TrimEnd()); 
        OracleParameter p5 = new OracleParameter("u_password", PasswordTextBox.Text.TrimEnd()); 
        cmd.Parameters.Add(p1); 
        cmd.Parameters.Add(p2); 
        cmd.Parameters.Add(p3); 
        cmd.Parameters.Add(p4); 
        cmd.Parameters.Add(p5); 
        OracleCommand cmd_chk = new OracleCommand(); 
        cmd_chk.Connection = conn; 
        cmd_chk.CommandText = "check_user_372640"; 
        cmd_chk.CommandType = CommandType.StoredProcedure; 
        OracleParameter p6 = new OracleParameter("user_id", UserIDTextBox.Text.TrimEnd()); 
        cmd_chk.Parameters.Add(p6); 
        cmd_chk.Parameters.Add("id", OracleDbType.Varchar2).Direction = ParameterDirection.Output; 
        conn.Open(); 
        cmd_chk.ExecuteNonQuery(); 
        id=(string)cmd_chk.Parameters["id"].Value; 
        //OracleDataReader rd = cmd_chk.ExecuteReader(); 
        if (id != null && id != "") 
        { 
         //rd.Read(); 
         SuccessLabel.Visible = false; 
         FailureLabel.Visible = true; 
        } 
        else 
        { 
         cmd.ExecuteNonQuery(); 
         SuccessLabel.Visible = true; 
         FailureLabel.Visible = false;  
        } 
       }catch(Exception){ 
        Console.WriteLine("SQL Exception Occured"); 
       } 
      } 

     } 
    } 
} 

我的Oracle過程是:

create or replace procedure check_user_372640(
user_id in varchar2, 
id out varchar2 
) 
as 
u_id varchar2(20); 
begin 
select user_id into u_id from ACTIVITY_USERS_372640 where user_id=user_id; 
id:=u_id; 
end; 

回答

8

它現在正在爲我工​​作。 錯誤是我已經聲明瞭一個參數「Id」作爲varchar2。但我沒有給出任何規模。 現在我已經宣佈最大大小的參數和它的工作正常。

cmd_chk.Parameters.Add("id", OracleDbType.Varchar2,32767).Direction = ParameterDirection.Output; 
0

The problem originates from using Char which is a fixed length string. Not sure where, but somewhere in your code you try to put a Char or varchar2 string of length N into a char of lengh M where M > N.

0

你能與 錨定的數據類型嘗試像%type.
語法: - tablename.colname%type.

0

你需要INC rease的大小u_id

u_id varchar2(4000); 
相關問題