Estimados:
este es mi primer post y es para pedir ayuda con un programa que no me funca y ya lo he revisado mil veces y no se por que, les cuento es un programa para insertar clientes en una tabla con distintos datos, la conexion me funciona para la tratar de insertar los datos me genera el error "ORA-00936: missing expression", este es el codigo:
public static bool Guardar(Cliente _cliente)
{
try
{
Conexion conexion = new Conexion();
OracleConnection sqlConnection = conexion.Conectar();
if (sqlConnection != null)
{
OracleCommand comando = sqlConnection.CreateCommand();
comando.CommandText = @"INSERT INTO VALIDACION(Empresa,
FechaEnvio,
Fecha,
Cuenta,
FonoContacto,
CuotasPorVencer,
CuotasVencidas,
MontoDeuda,
ValorCuotas,
MontoCapital,
MontoInteres,
MontoReprogramar,
NumeroCuotas,
ValorNuevaCuota,
PrimerVcto,
TasaInteres,
CuotaDiferidad,
EjecutivoExterno,
TramoProvision,
Producto,
TipoCartera,
Ejecutivo,
EstadoRep,
MotivoRechazo,
Correo,
NuevoTelefono,
NuevaDireccion,
Observacion,
RebajadoEnTC,
Modificacion,
Codigo,
Supervisor,
Ite,
ValorRescate) VALUES(@Empresa,
@FechaEnvio,
@Fecha,
@Cuenta,
@FonoContacto,
@CuotasPorVencer,
@CuotasVencidas,
@MontoDeuda,
@ValorCuotas,
@MontoCapital,
@MontoInteres,
@MontoReprogramar,
@NumeroCuotas,
@ValorNuevaCuota,
@PrimerVcto,
@TasaInteres,
@CuotaDiferidad,
@EjecutivoExterno,
@TramoProvision,
@Producto,
@TipoCartera,
@Ejecutivo,
@EstadoRep,
@MotivoRechazo,
@Correo,
@NuevoTelefono,
@NuevaDireccion,
@Observacion,
@RebajadoEnTC,
@Modificacion,
@Codigo,
@Supervisor,
@Ite,
@ValorRescate)";
comando.CommandType = CommandType.Text;
comando.Parameters.Add("@Empresa",_cliente.Empresa);
comando.Parameters.Add("@FechaEnvio",_cliente.FechaEnvio);
comando.Parameters.Add("@Fecha",_cliente.Fecha);
comando.Parameters.Add("@Cuenta",_cliente.Cuenta);
comando.Parameters.Add("@FonoContacto",_cliente.FonoContacto);
comando.Parameters.Add("@CuotasPorVencer",_cliente.CuotasPorVencer);
comando.Parameters.Add("@CuotasVencidas",_cliente.CuotasVencidas);
comando.Parameters.Add("@MontoDeuda",_cliente.MontoDeuda);
comando.Parameters.Add("@ValorCuotas",_cliente.ValorCuotas);
comando.Parameters.Add("@MontoCapital",_cliente.MontoCapital);
comando.Parameters.Add("@MontoReprogramar",_cliente.MontoReprogramar);
comando.Parameters.Add("@NumeroCuotas",_cliente.NumeroCuotas);
comando.Parameters.Add("@ValorNuevaCuota",_cliente.ValorNuevaCuota);
comando.Parameters.Add("@PrimerVcto",_cliente.PrimerVcto);
comando.Parameters.Add("@TasaInteres",_cliente.TasaInteres);
comando.Parameters.Add("@CuotaDiferidad",_cliente.CuotaDiferidad);
comando.Parameters.Add("@EjecutivoExterno",_cliente.EjecutivoExterno);
comando.Parameters.Add("@TramoProvision",_cliente.TramoProvision);
comando.Parameters.Add("@Producto",_cliente.Producto);
comando.Parameters.Add("@TipoCartera",_cliente.TipoCartera);
comando.Parameters.Add("@Ejecutivo",_cliente.Ejecutivo);
comando.Parameters.Add("@EstadoRep",_cliente.EstadoRep);
comando.Parameters.Add("@MotivoRechazo",_cliente.MotivoRechazo);
comando.Parameters.Add("@Correo",_cliente.Correo);
comando.Parameters.Add("@NuevoTelefono",_cliente.NuevoTelefono);
comando.Parameters.Add("@NuevaDireccion",_cliente.NuevaDireccion);
comando.Parameters.Add("@Observacion",_cliente.Observacion);
comando.Parameters.Add("@RebajadoEnTC",_cliente.RebajadoEnTC);
comando.Parameters.Add("@Modificacion",_cliente.Modificacion);
comando.Parameters.Add("@Codigo",_cliente.Codigo);
comando.Parameters.Add("@Supervisor",_cliente.Supervisor);
comando.Parameters.Add("@Ite",_cliente.Ite);
comando.Parameters.Add("@ValorRescate",_cliente.ValorRescate);
comando.ExecuteNonQuery();
conexion.Close();
return true;
}
return false;
}
catch (Exception)
{
return false;
}
}
si me pueden ayudar, gracias.
es recomendable que crees el store procedure en la base de datos.
Cita de: MaLkAvIaN_NeT en 30 Junio 2012, 22:37 PM
es recomendable que crees el store procedure en la base de datos.
si tiene procedimiento de almacenado, pero lo yo trato de hacer es insertar los datos que obtengo del programa (vía windows forms).
:(
de hecho modifique el programa y me sale lo mismo:
public static bool Guardar(Cliente _cliente)
{
try
{
Conexion conexion = new Conexion();
OracleConnection sqlConnection = conexion.Conectar();
if (sqlConnection != null)
{
OracleCommand comando = sqlConnection.CreateCommand();
comando.CommandText = @"INSERT INTO VALIDACION
(EMPRESA,FECHAENVIO,
FECHA,
CUENTA,
FONOCONTACTO,
CUOTASPORVENCER,
CUOTASVENCIDAS,
MONTODEUDA,
VALORCUOTAS,
MONTOCAPITAL,
MONTOINTERES,
MONTOREPROGRAMAR,
NUMEROCUOTAS,
VALORNUEVACUOTA,
PRIMERVCTO,
TASAINTERES,
CUOTADIFERIDAD,
EJECUTIVOEXTERNO,
TRAMOPROVISION,
PRODUCTO,
TIPOCARTERA,
EJECUTIVO,
ESTADOREP,
MOTIVORECHAZO,
CORREO,
NUEVOTELEFONO,
NUEVADIRECCION,
OBSERVACION,
REBAJADOENTC,
MODIFICACION,
CODIGO,
SUPERVISOR,
ITE,
VALORRESCATE) VALUES(" + _cliente.Empresa + "','"
+ _cliente.FechaEnvio + "','"
+ _cliente.Fecha + "','"
+ _cliente.Cuenta + "','"
+ _cliente.FonoContacto + "','"
+ _cliente.CuotasPorVencer + "','"
+ _cliente.CuotasVencidas + "','"
+ _cliente.MontoDeuda + "','"
+ _cliente.ValorCuotas + "','"
+ _cliente.MontoCapital + "','"
+ _cliente.MontoInteres + "','"
+ _cliente.MontoReprogramar + "','"
+ _cliente.NumeroCuotas + "','"
+ _cliente.ValorNuevaCuota + "','"
+ _cliente.PrimerVcto + "','"
+ _cliente.TasaInteres + "','"
+ _cliente.CuotaDiferidad + "','"
+ _cliente.EjecutivoExterno + "','"
+ _cliente.TramoProvision + "','"
+ _cliente.Producto + "','"
+ _cliente.TipoCartera + "','"
+ _cliente.Ejecutivo + "','"
+ _cliente.EstadoRep + "','"
+ _cliente.MotivoRechazo + "','"
+ _cliente.Correo + "','"
+ _cliente.NuevoTelefono + "','"
+ _cliente.NuevaDireccion + "','"
+ _cliente.Observacion + "','"
+ _cliente.RebajadoEnTC + "','"
+ _cliente.Modificacion + "','"
+ _cliente.Codigo + "','"
+ _cliente.Supervisor + "','"
+ _cliente.Ite + "','"
+ _cliente.ValorRescate + "')";
comando.ExecuteNonQuery();
conexion.Close();
return true;
}
return false;
}
catch (Exception)
{
return false;
}
}
Primero que nada debes bajarte el conector de Oracle para .net desde :
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
Ya que el de Windows ya esta algo viejo mirar:
http://msdn.microsoft.com/es-es/library/77d8yct7%28v=vs.110%29.aspx
según eso dice:
The types in System.Data.OracleClient are deprecated. The types are supported in version 4 of the .NET Framework but will be removed in a future release. Microsoft recommends that you use a third-party Oracle provider.
Ahora el motivo de tu error es que en lugar de "@" para los parametros se usa los ":"
ejemplo:
String commandString = "INSERT INTO Users (Name, Desk, UpdateTime) VALUES (:Name, :Desk, :UpdateTime)";
using (OracleCommand command = new OracleCommand(commandString, _connection, _transaction))
{
command.Parameters.Add("Name", OracleType.VarChar, 50).Value = strategy;
command.Parameters.Add("Desk", OracleType.VarChar, 50).Value = deskName ?? OracleString.Null;
command.Parameters.Add("UpdateTime", OracleType.DateTime).Value = updated;
command.ExecuteNonQuery();
}
El ejemplo fue sacado de http://stackoverflow.com/questions/343299/bulk-insert-to-oracle-using-net
Ahora la forma que recomiendo seria que crees un packete y dentro pongas los procedimientos almacenados un ejemplo con un pequeña tabla que hice.
-- Creamos la tabla
CREATE TABLE clientes
(
idcliente INTEGER NOT NULL,
nombre VARCHAR2(100)NOT NULL,
fecha_registro DATE NOT NULL,
CONSTRAINT pk_departamentos PRIMARY KEY(idcliente)
);
/
-- Creamos el packete y definimos los procedimientos-funciones etc.
CREATE OR REPLACE PACKAGE pk_clientes IS
TYPE t_cursor IS REF CURSOR;
PROCEDURE sp_registra(
p_nombre VARCHAR2,
p_fecha_registro DATE
);
PROCEDURE sp_actualiza(
p_idcliente INTEGER,
p_nombre VARCHAR2,
p_fecha_registro DATE
);
PROCEDURE sp_get_lista(
p_resul OUT t_cursor
);
PROCEDURE sp_get_info_cliente(
p_idcliente INTEGER,
p_resul OUT t_cursor
);
END pk_clientes;
/
-- Creamos el cuerpo del packete aqui se implementa los procedimientos-funciones etc.
CREATE OR REPLACE PACKAGE BODY pk_clientes IS
--Procedimiento para Registrar
PROCEDURE sp_registra(
p_nombre VARCHAR2,
p_fecha_registro DATE
)
IS
BEGIN
INSERT INTO clientes(
nombre,
fecha_registro
)VALUES(
p_nombre,
p_fecha_registro
);
COMMIT;
END;
--Procedimiento para Actualizar
PROCEDURE sp_actualiza(
p_idcliente INTEGER,
p_nombre VARCHAR2,
p_fecha_registro DATE
)
IS
BEGIN
UPDATE clientes SET
nombre=p_nombre,
fecha_registro=p_fecha_registro
WHERE
idcliente=p_idcliente;
COMMIT;
END;
--Procedimiento para Listar
PROCEDURE sp_get_lista(
p_resul OUT t_cursor
) IS
BEGIN
OPEN p_resul FOR
SELECT
idcliente,
nombre,
fecha_registro
FROM
clientes;
END;
--Procedimiento para Informacion de un cliente
PROCEDURE sp_get_info_cliente(
p_idcliente INTEGER,
p_resul OUT t_cursor
) IS
BEGIN
OPEN p_resul FOR
SELECT
idcliente,
nombre,
fecha_registro
FROM
clientes
WHERE
idcliente=p_idcliente;
END;
END pk_clientes;
/
-- Secuencia para hacer el campo idcliente autonumerico
CREATE SEQUENCE seq_cliente;
/
CREATE OR REPLACE TRIGGER tr_seq_cliente BEFORE INSERT ON clientes
FOR EACH ROW
BEGIN
SELECT seq_cliente.nextval INTO :new.idcliente FROM dual;
END;
Como podras fijarte eh creado un packete con todas las funciones que necesito para hacer mantenimiento a la tabla clientes. bueno para llamarlo desde .net asumiento que tengo una clase oCliente con propiedades idcliente,nombre,fecha_registro y quiero invocar al procedimiento sp_registra seria asi:
public static void RegistrarCliente(oCliente info)
{
using (OracleConnection oCn = new OracleConnection(App.GetStrConnection()))
{
string proc = string.Empty;
proc = "pk_clientes.sp_registra";
OracleCommand oCmd = new OracleCommand(proc, oCn);
oCmd.CommandType = CommandType.StoredProcedure;
oCmd.Parameters.Add(new OracleParameter("p_nombre", OracleDbType.Varchar2)).Value = info.nombre;
oCmd.Parameters.Add(new OracleParameter("p_fecha_registro", OracleDbType.Date)).Value = info.fecha_registro;
oCn.Open();
try
{
oCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}
}
Bueno para no hacerlo mas largo te adjunto un pequeño proyecto que hice donde muestro mas detallado la invocacion de cada procedimiento del packete creado.
https://rapidshare.com/files/907284720/TestOracle.zip
Para correrlo pues debes editar la cadena de conexion de App.config y claro ejecutar el script SQL de lineas arriba!!