如何使用C#调用oracle的存储过程?

时间:2018-10-04 14:47:53

标签: c# sql oracle oracle-sqldeveloper

嗨,我在oracle中有一个存储过程,可以在表employee中插入

这是我的存储过程,它工作正常

CREATE OR REPLACE PROCEDURE insert_Emp(idEmp in NUMBER, nameEmp in VARCHAR2, 
addressEmp in VARCHAR2, emailEmp in VARCHAR2,
phoneEmp in CHAR, sexoEmp in CHAR, duiEmp in CHAR, nitEmp in CHAR, salaryEmp in NUMBER, userEmp in VARCHAR2,
contraEmp in VARCHAR2, cargoEmp in VARCHAR2, activoEmp in CHAR)
IS
BEGIN
    INSERT INTO EMPLEADO(IdEmpleado, Nombre, Direccion, Email, Telefono, Sexo, Dui, Nit, Sueldo, Usuario, Contraseña, Cargo, Activo) 
    VALUES (idEmp, nameEmp, addressEmp, emailEmp, phoneEmp, sexoEmp, duiEmp, nitEmp, salaryEmp, userEmp, contraEmp, cargoEmp, activoEmp);
    COMMIT;
END;
/

但是问题是当我在C#程序中调用它时,无法使用序列EMP_SEQ.nextvalue

OracleCommand cmd = new OracleCommand("INSERT_EMP", DataBase.Conexion());
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("idEmp", OracleDbType.Decimal).Value = EMP_SEQ.nextval;
                    cmd.Parameters.Add("nameEmp", OracleDbType.Varchar2).Value = txtNombre.Text;
                    cmd.Parameters.Add("addressEmp", OracleDbType.Varchar2).Value = txtDireccion.Text;
                    cmd.Parameters.Add("emailEmp", OracleDbType.Varchar2).Value = txtEmail.Text;
                    cmd.Parameters.Add("phoneEmp", OracleDbType.Char).Value = txtTelefono.Text;
                    cmd.Parameters.Add("sexoEmp", OracleDbType.Char).Value = cb_sexo.Text;
                    cmd.Parameters.Add("duiEmp", OracleDbType.Char).Value = txtDUI.Text;
                    cmd.Parameters.Add("nitEmp", OracleDbType.Char).Value = txtNIT.Text;
                    cmd.Parameters.Add("salaryEmp", OracleDbType.Decimal).Value = txtSueldo.Text;
                    cmd.Parameters.Add("userEmp", OracleDbType.Varchar2).Value = txtUser.Text;
                    cmd.Parameters.Add("contraEmp", OracleDbType.Varchar2).Value = tb_contraseña.Text;
                    cmd.Parameters.Add("cargoEmp", OracleDbType.Varchar2).Value = cb_cargo.Text;
                    cmd.Parameters.Add("activoEmp", OracleDbType.Char).Value = obtenerEstado();
                    OracleDataAdapter da = new OracleDataAdapter(cmd);
                    cmd.ExecuteNonQuery();

那么我该如何毫无问题地放置序列呢?

1 个答案:

答案 0 :(得分:2)

是否应该在存储过程中使用EMP_SEQ.nextvalue,而不是将其发送给?像这样:

INSERT INTO EMPLEADO(IdEmpleado, Nombre, Direccion, Email, Telefono, Sexo, Dui, Nit, Sueldo, Usuario, Contraseña, Cargo, Activo) 
VALUES (EMP_SEQ.nextvalue, nameEmp, addressEmp, emailEmp, phoneEmp, sexoEmp, duiEmp, nitEmp, salaryEmp, userEmp, contraEmp, cargoEmp, activoEmp);

(或者也许放在前一行的变量中,然后根据需要使用该变量在查询中。)

然后,您的存储过程将不需要期望一个标识符,它将在内部生成一个。因此idEmp参数可以完全删除。