这个存储过程可把我弄火大了
代码这样写的try
{
OracleConnection ocon = new OracleConnection("Data Source=fxdg;uid=abs_test;pwd=12345678");
OracleCommand ocmd = new OracleCommand("APPENDNEWBOOK");
ocmd.Connection = ocon;
ocmd.CommandType = CommandType.StoredProcedure;
ocmd.Parameters.Add("p_barcode", OracleType.VarChar).Value = isbn.Trim();
ocmd.Parameters.Add("p_bookname", OracleType.VarChar).Value = title.Trim();
ocmd.Parameters.Add("p_price", OracleType.Number).Value = price;
ocmd.Parameters.Add("p_bookid", OracleType.VarChar, 20);
ocmd.Parameters["p_bookid"].Direction = ParameterDirection.Output;
ocon.Open();
ocmd.ExecuteNonQuery();
ocon.Close();
return ocmd.Parameters["p_bookid"].Value.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
最后我要生成的值,可是老给我返回"p_bookid",也不报错,存储过程调试没有问题.帮我看看哪里的问题 --------------------编程问答-------------------- 存储过程怎么写的? --------------------编程问答-------------------- create or replace procedure AppendNewBook(p_BarCode in varchar2,
p_BOOKNAME in varchar2,
p_PRICE in number,
p_BookID out VarChar2) is
v_CNT Number(5);
v_bookID Dict_BookCard.BookID%Type ;
v_ISBN Dict_BookCard.Isbn%type;
v_BarCode Dict_BookCard.IsbnBarCode%type;
begin
/*如果书号、书名、定价一样就找出BOOKID直接返回*/
v_BarCode := trim(p_BarCode);
Select Count(BookID) Into v_CNT
from Dict_BookCard
where Isbnbarcode = p_BarCode
And BookName =p_BOOKNAME
And Price = p_PRICE;
if v_CNT > 0 then
Select Max(BookID) into p_BookID
from Dict_bookcard
where Isbnbarcode = p_BarCode
And BookName =p_BOOKNAME
And Price = p_PRICE;
return;
end if ;
if SubStr(p_BarCode,1,3) ='978' and Length(p_BarCode) = 13 then
v_ISBN := SubStr(p_BarCode,4,9);
else
v_ISBN := p_BarCode;
end if;
Select Count(BookID) Into v_CNT
from Dict_BookCard
where BookID Like v_ISBN||'%';
if v_CNT < 9 then
V_bookid := v_ISBN||'0'||to_Char(v_CNT+1);
else
V_bookid := v_ISBN||to_Char(v_CNT+1);
end if;
Insert Into Dict_BookCard(BookID,Isbnbarcode,Bookname,PRICE,CREATEDATE,SALEMODE,STORETYPE)
Values(V_bookid,p_BarCode,p_BOOKNAME,p_PRICE,sysdate,'寄销','图书');
p_BookID := v_BookID;
commit;
end AppendNewBook;
过程我测试过了,可以正常生成id序列号 --------------------编程问答-------------------- 如果存储过程只有return的值
程序里面改成
ParameterDirection.ReturnValue
--------------------编程问答-------------------- 一时半会没看出什么问题,不过发现了一个小问题,就是存储过程中是Varchar2,你传的是Varchar,你看看会不会是这个问题。 --------------------编程问答-------------------- 按楼上说的,出来的值是"ReturnValue" - -!
还有哪里有问题 --------------------编程问答-------------------- 外部参数前面统统加一个@ --------------------编程问答-------------------- 问题是.net这里面oracle type只有varchar,应该没有什么影响吧?如果有用什么替代?
--------------------编程问答-------------------- 加@符号也无效,出来的还是莫明其妙的参数名,而不是参数值......,这都什么事啊. --------------------编程问答-------------------- 存储过程测试过没有?能取出 p_BookID吗? --------------------编程问答-------------------- 如果不行搞个ReturnValue 试试,不要用out。 --------------------编程问答-------------------- 再不行就用一句select p_BookID返回。 --------------------编程问答-------------------- 存储过程没有问题,可以取出p_bookid,我在plsql里调试过的,returnvalue返回的时候就给我返回了一个"returnvalue",郁闷啊 --------------------编程问答-------------------- 换种写法,还是一样,value怎么和参数名变成一样了...... --------------------编程问答-------------------- 哎,我没有oracle环境,不能具体调试,不好意思了。
就算有也不懂oracle语法...寒-_-#!。
楼主不要灰心一步一步慢慢来,不行就上网查查,或在这边等等热心人,问题肯定可以解决的。 --------------------编程问答-------------------- 存储过程的问题不是程序的问题 小子 细心点
补充:.NET技术 , C#