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
--------------------编程问答-------------------- 这么完整记得给分哈! --------------------编程问答-------------------- http://blog.csdn.net/itblog/archive/2006/05/24/752869.aspx --------------------编程问答--------------------
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();
改了后到成了是这个异常:
--------------------编程问答-------------------- 去掉@变成是这种 异常: 调用SP2时参数个数或类型错误。唉 还是不行,到底是什么原因呀,郁闷ing
--------------------编程问答-------------------- 回复4楼:我想要得到的是 存储过程的输出参数值 --------------------编程问答-------------------- 把存储过程改下
--------------------编程问答-------------------- 呵呵,谢谢,用你的方法终于解决了!! --------------------编程问答-------------------- 呵呵,谢谢,用你的方法终于解决了!! --------------------编程问答-------------------- --------------------编程问答-------------------- 还需要定义一个ReturnValue的Parameter的。
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;
更多Oracle PL/SQL调用方法,参考:
http://blog.csdn.net/fangxinggood/archive/2005/10/17/507989.aspx
--------------------编程问答-------------------- 这个可是初级问题哦!
补充:.NET技术 , C#