当前位置:编程学习 > C#/ASP.NET >>

这个存储过程可把我弄火大了

代码这样写的

 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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,