Ayuda con Programa C# Conexion a Oracle

Iniciado por trukologo, 29 Junio 2012, 21:29 PM

0 Miembros y 1 Visitante están viendo este tema.

trukologo

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:

Código (cpp) [Seleccionar]

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.

MaLkAvIaN_NeT

es recomendable que crees el store procedure en la base de datos.
a por las buenas ideas

trukologo

#2
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:

Código (csharp) [Seleccionar]

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;
            }
        }

.::IT::.

#3
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:
Código (sql) [Seleccionar]

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.

Código (sql) [Seleccionar]

-- 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:

Código (vbnet) [Seleccionar]

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!!
Simplemente .::IT::.