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

c#中如何调用存储过程

我写了个简单的存储过程,如下:
create or replace procedure sp2(v_empno number) is
  v_sal number(7,2);
   begin
   update emp set sal=sal+200 where empno=v_empno;
   select  sal into v_sal  from emp where empno=v_empno;
   dbms_output.put_line('员工号:'||v_empno||'  工资:'||v_sal);
   end;
在c#中的调用程序如下:
string constr = "data source=test;user id=scott;password=tiger";
            OracleConnection con = new OracleConnection(constr);
            OracleCommand com = new OracleCommand("sp2", con);
            com.CommandType = CommandType.StoredProcedure;
            con.Open();
        OracleParameter p1 = new OracleParameter("@v_empno", OracleType.Int32);
            OracleParameter p2 = new OracleParameter("@v_sal",OracleType.Double);    
               p1.Direction = ParameterDirection.Input;
                p1.Value = 7369;
                p2.Direction = ParameterDirection.Output;
                com.Parameters.Add(p1);
                com.Parameters.Add(p2);
                com.ExecuteNonQuery();           
          textBox1.Text = com.Parameters["v_sal"].Value.ToString();
          con.Close();
        }

可是一直提示我ORA-01036:非法的变量名/编号
请高手指导,谢谢! --------------------编程问答-------------------- 把@符号去掉  

OracleParameter p1 = new OracleParameter("v_empno", OracleType.Int32);
  OracleParameter p2 = new OracleParameter("v_sal",OracleType.Double);  --------------------编程问答-------------------- --------------------编程问答-------------------- 楼上OK --------------------编程问答-------------------- 这是给你的参考代码

CREATE PROCEDURE AddAreaRecord --创建视图
(
@AreaNo nvarchar(10),
@AreaName nvarchar(10),
@BulidNum int,

@Coord nvarchar(10),
@Remark nvarchar(50)

)
 AS
Begin Transaction Add_AreaRecord
IF Exists (SELECT 1 FROM Area Where AreaNo = @AreaNo) --判断表里面是否有该条记录
ROLLBACK TRANSACTION Add_AreaRecord  --如果有则不执行

ELSE  --否则,执行添加另一个表的记录
BEGIN

INSERT INTO Area --添加一个表的记录
(AreaNo,AreaName,BulidNum,Coordinate,Remark)
VALUES
(@AreaNo,@AreaName,@BulidNum,@Coord,@Remark)

COMMIT TRANSACTION Add_AreaRecord  --提交事务

END
GO



            SqlConnection conn = G_SqlExecute.GetCon();
            conn.Open();
            SqlCommand myCommand = new SqlCommand("AddAreaRecord", conn);

            //指明sql的操作类型是存储过程
            myCommand.CommandType = CommandType.StoredProcedure;

            //给存储过程添加参数
            SqlParameter para1 = new SqlParameter("@AreaNo", SqlDbType.NVarChar, txtAreaNo.Text.Length);
            para1.Value = txtAreaNo.Text;
            myCommand.Parameters.Add(para1);

            SqlParameter para2 = new SqlParameter("@AreaName", SqlDbType.NVarChar, txtAreaName.Text.Length);
            para2.Value = txtAreaName.Text;
            myCommand.Parameters.Add(para2);

            SqlParameter para3 = new SqlParameter("@BulidNum", SqlDbType.NVarChar, txtBulidNum.Text.Length);
            para3.Value = txtBulidNum.Text;
            myCommand.Parameters.Add(para3);

            SqlParameter para4 = new SqlParameter("@Remark", SqlDbType.NVarChar, rtbRemark.Text.Length);
            para4.Value = rtbRemark.Text;
            myCommand.Parameters.Add(para4);

            SqlParameter para5 = new SqlParameter("@Coord", SqlDbType.NVarChar, txtCoord.Text.Length);
            para5.Value = txtCoord.Text;
            myCommand.Parameters.Add(para5);


            if (myCommand.ExecuteNonQuery() > 0)
            {
                MessageBox.Show("数据添加成功!");
                initAreaNo();
                LoadData();
            }
            else
            {
                MessageBox.Show("数据添加失败!");
            }
            conn.Close();
--------------------编程问答-------------------- 这么完整记得给分哈! --------------------编程问答-------------------- http://blog.csdn.net/itblog/archive/2006/05/24/752869.aspx --------------------编程问答--------------------
引用 1 楼 darksmile 的回复:
把@符号去掉  

OracleParameter p1 = new OracleParameter("v_empno", OracleType.Int32);
  OracleParameter p2 = new OracleParameter("v_sal",OracleType.Double);



改了后到成了是这个异常:
   --------------------编程问答-------------------- 去掉@变成是这种 异常: 调用SP2时参数个数或类型错误。唉 还是不行,到底是什么原因呀,郁闷ing
--------------------编程问答-------------------- 回复4楼:我想要得到的是 存储过程的输出参数值 --------------------编程问答-------------------- 把存储过程改下

create or replace procedure sp2(v_empno in number, v_sal out number) is
begin
  update emp set sal=sal+200 where empno=v_empno;
  select sal into v_sal from emp where empno=v_empno;
  dbms_output.put_line('员工号:'||v_empno||' 工资:'||v_sal);
end;
--------------------编程问答-------------------- 呵呵,谢谢,用你的方法终于解决了!! --------------------编程问答-------------------- 呵呵,谢谢,用你的方法终于解决了!! --------------------编程问答-------------------- --------------------编程问答-------------------- 还需要定义一个ReturnValue的Parameter的。

更多Oracle PL/SQL调用方法,参考:


http://blog.csdn.net/fangxinggood/archive/2005/10/17/507989.aspx
--------------------编程问答-------------------- 这个可是初级问题哦!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,