请有人帮我解决这个问题。我收到此错误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);
}
答案 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
。虽然varchar2
和varchar
是截至目前的同义词,但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;