System.Data.OracleClient.OracleException:ORA-06550:第1行第7列:

时间:2014-03-01 17:58:14

标签: c# oracle visual-studio-2012 sqlplus

请有人帮我解决这个问题。我收到此错误PLS-00306:调用'INSERTFORUM'时参数的数量或类型错误 ORA-06550:第1行第7列: PL / SQL:忽略语句

我检查了我的存储过程的第一行和我在C#中的参数,我没有看到任何遗漏.course_ID int32,也在我的程序中,s在哪里出错? 谢谢

我的Oracle存储过程

CREATE OR REPLACE PROCEDURE INSERTforum(
       p_course_id IN Int,
       p_question IN Varchar,
       p_postername IN Varchar,
       p_blog_date IN Date)
AS
BEGIN

  INSERT INTO forum ("COURSE_ID", "QUESTION", "POSTERNAME", "BLOG_DATE") 
  VALUES (p_course_id, p_question,p_postername, p_blog_date);

  COMMIT;

END;
/

背后的C#代码

    OracleCommand oraCmd = new OracleCommand("InsertForum", oraConnection);
oraCmd.CommandType = System.Data.CommandType.StoredProcedure;
                                                                /*or Decimal*/
oraCmd.Parameters.Add(new OracleParameter("p_course_id", OracleDbType.Int32,
                      System.Data.ParameterDirection.Input)).Value = 123;
oraCmd.Parameters.Add(new OracleParameter("p_question",  OracleDbType.Varchar2,
                      System.Data.ParameterDirection.Input)).Value = "question";
oraCmd.Parameters.Add(new OracleParameter("p_postername", OracleDbType.Varchar2,
                      System.Data.ParameterDirection.Input)).Value = "postername";
oraCmd.Parameters.Add(new OracleParameter("p_blog_date", OracleDbType.Date,
                      System.Data.ParameterDirection.Input)).Value = DateTime.Now;
try 
{
    oraCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);

}

3 个答案:

答案 0 :(得分:2)

您正在使用Microsoft Oracle客户端(using System.Data.OracleClient)。如果使用适当版本的Oracle Data Provider for .NET of Oracle Data Access Components(ODAC),您的生活会更容易一些 - 您可以利用本机oracle数据类型和功能。此外,尝试使用Oracle(非ANSI数据类型,无论如何将转换为Oracle本机数据类型)数据类型。例如,使用number代替int。此外,使用varchar2()数据类型而不是varchar。虽然varchar2varchar是截至目前的同义词,但varchar的行为在将来可能会发生变化,因此最好坚持varchar2

以下是一个例子:

设置:

/* your table */
create table forum(
  course_id  number,
  question   varchar2(123),
  postername varchar2(123),
  blog_date  date
);

/* the stored procedure*/
create or replace procedure InsertForum(
  p_course_id  in number,
  p_question   in varchar2,
  p_postername in varchar2,
  p_blog_date  in date
) as
begin
  insert into forum (course_id, question, postername, blog_date) 
    values (p_course_id, p_question, p_postername, p_blog_date);
  commit; 
  /* As a side note. It would be better to allow a calling application
     to commit or rollback transaction. 
     */
end;

C#代码:

...
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
....

string oraConnectionString = "Data source=data_source;User id=user;password=pwd;";
OracleConnection oraConnection = new OracleConnection(oraConnectionString);
oraConnection.Open();

OracleCommand oraCmd = new OracleCommand("InsertForum", oraConnection);
oraCmd.CommandType = System.Data.CommandType.StoredProcedure;
                                                                /*or Decimal*/
oraCmd.Parameters.Add(new OracleParameter("p_course_id", OracleDbType.Int32,
                      System.Data.ParameterDirection.Input)).Value = 123;
oraCmd.Parameters.Add(new OracleParameter("p_question",  OracleDbType.Varchar2,
                      System.Data.ParameterDirection.Input)).Value = "question";
oraCmd.Parameters.Add(new OracleParameter("p_postername", OracleDbType.Varchar2,
                      System.Data.ParameterDirection.Input)).Value = "postername";
oraCmd.Parameters.Add(new OracleParameter("p_blog_date", OracleDbType.Date,
                      System.Data.ParameterDirection.Input)).Value = DateTime.Now;
try 
{
    oraCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

结果:

column question format a11;
column postername format a11;

select *
  from forum;

COURSE_ID QUESTION    POSTERNAME  BLOG_DATE         
---------- ----------- ----------- -------------------
       123 question    postername  02-03-2014 12:11:59

还应注意,当您通过调用ExecuteNonQuery()方法执行存储过程时,受影响的行数将为-1。只有在执行DML(insert等)语句时,它才会为您提供预期的受影响行数。

答案 1 :(得分:1)

试试这个:

command.Parameters.Add(new OracleParameter("course_Id",OracleDbType.Number, course_Id)) ;
command.Parameters.Add(new OracleParameter("question",OracleDbType.VarChar, question));
command.Parameters.Add(new OracleParameter( "posterName",OracleDbType.VarChar,posterName));
command.Parameters.Add(new  OracleParameter("blog_date",OracleDbType.DateTime, blog_date));

答案 2 :(得分:0)

尝试使用System.Data.OracleClient.OracleType

替换System.Data.DBType
    command.Parameters.Add("p_course_id", OracleType.Number).Value = course_Id;
    command.Parameters.Add("p_question", OracleType.VarChar).Value = question;
    command.Parameters.Add("p_postername", OracleType.VarChar).Value = posterName;
    command.Parameters.Add("p_blog_date", OracleType.DateTime).Value = blog_date;