C sharp - Llamada a Procedimiento Oracle

 
Vista:

Llamada a Procedimiento Oracle

Publicado por Sonia (1 intervención) el 27/03/2008 11:11:49
Hola,

Tengo un problemilla, no encuentro solución
Con c # hago una llamada a un procedimiento de BD Oracle, este es mi codigo:

[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Update()
{
if (base.IsDirty)
{
using (OracleConnection cn = DAL.OracleCrearConexion(cadenaConexion))
{
cn.Open();
using (DbCommand cm = cn.CreateCommand())
{
DateTime fecha = new DateTime();
cm.CommandText = "UPDATE_FACTURA";
cm.CommandType = CommandType.StoredProcedure;
DAL.AñadirParametro(cm, "P_NUMERODEFACTURA", DbType.String, _numeroFactura,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_FECHA", DbType.DateTime, _fecha.DBValue,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_IMPORTETOTAL", DbType.Decimal, _importeTotal,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_PORCENTAJEIVA", DbType.Decimal, _porcentajeIva,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_BASEIMPONIBLE", DbType.Decimal, _baseImponible,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_DIRECCION", DbType.String, _direccion,
ParameterDirection.Input);
DAL.AñadirParametro(cm, "P_NUEVAFECHAULTIMAMODIFICACION", DbType. DateTime, fecha,
ParameterDirection.Output);
DAL.AñadirParametro(cm, "P_FECHAULTIMAMODIFICACION", DbType.DateTime,
_fechaUltimaModificacion, ParameterDirection.Input);
cm.ExecuteNonQuery();

string s = (string)cm.Parameters["P_NUEVAFECHAULTIMAMODIFICACION"].Value;
SmartDate f = new SmartDate(s);
}
}
}
// Actualizar las lineas de factura
_lineasFactura.Update(this);
}

El método AñadirParametro, de la librería DAL, es el siguiente:

public static void AñadirParametro(DbCommand comando, string nombreParametro, System.Data.DbType tipo, object valor, System.Data.ParameterDirection direccion)
{
DbParameter parametro = comando.CreateParameter();
parametro.Direction = direccion;
parametro.ParameterName = nombreParametro;
parametro.DbType = tipo;
parametro.Value = valor;
comando.Parameters.Add(parametro);
}

Mi procedimiento de BD en Oracle, es el siguiente:

CREATE OR REPLACE PROCEDURE CARGADM.UPDATE_FACTURA
( P_NUMERODEFACTURA IN FACTURA.NUMERODEFACTURA%TYPE
, P_FECHA IN DATE
, P_IMPORTETOTAL IN FACTURA.IMPORTETOTAL%TYPE
, P_PORCENTAJEIVA IN FACTURA.PORCENTAJEIVA%TYPE
, P_BASEIMPONIBLE IN FACTURA.BASEIMPONIBLE%TYPE
, P_DIRECCION IN FACTURA.DIRECCION%TYPE
, P_FECHAULTIMAMODIFICACION IN FACTURA.FECHAULTIMAMODIFICACION%TYPE
(en tabla es un DATE)
, P_NUEVAFECHAULTIMAMODIFICACION OUT FACTURA.FECHAULTIMAMODIFICACION%TYPE
(en tabla es un DATE)
) AS

BEGIN
UPDATE FACTURA
SET FECHA=P_FECHA,IMPORTETOTAL=P_IMPORTETOTAL,PORCENTAJEIVA=P_PORCENTAJEIVA,
BASEIMPONIBLE=P_BASEIMPONIBLE,DIRECCION=P_DIRECCION,FECHAULTIMAMODIFICACION=SYSDATE
WHERE NUMERODEFACTURA=P_NUMERODEFACTURA

RETURNING FECHAULTIMAMODIFICACION INTO P_NUEVAFECHAULTIMAMODIFICACION;

IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20001,'No se ha podido actualizar el registro');
END IF;

END UPDATE_FACTURA;
/


En tiempo de ejecución, llamo al procedimiento de BD desde c# (con el código anterior) y me da el error:
System.ArgumentOutRangeException: Los parámetros de año, mes y día describen un campo DateTime que no se puede representar.
en System.DateTime.DateToTicks(Int32 year, Int32 month, Int32 day)
en System.Datetime..ctor((Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second)
en Oracle.DataAccess.Types.DateTimeConv.GetDateTime(OpoTSValCtx*pValCtx, OracleDbType oraType, Boolean bCheck)
en Oracle.DataAccess.Client.OracleParameter.PostBind_timeStamp()
en Oracle.DataAccess.Client.OracleParameter.PostBind(Oracleconnection conn, OpoSqlValCtx* pOpoSqlValCtx, Int32 arraySize)
en Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
en Carglass.GestionFacturas.Library.Factura.DataPortal_Update() en C:ProyectosGestionGestion.LibraryFactura.cs: línea 552 en dm(Object, Object[])
en Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) en C:FrameworkCslaReflectionMethodCaller.cs:linea 221




Alguien sabe que está pasando.

Gracias y saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Llamada a Procedimiento Oracle

Publicado por weirdmix (2 intervenciones) el 08/04/2008 00:49:49
esta linea:
DAL.AñadirParametro(cm, "P_FECHA", DbType.DateTime, _fecha.DBValue,
ParameterDirection.Input);

es la q supongo da el error, estas enviando un formato erroneo de fecha a la base de datos, verifica q formato necesita la base de datos y enviaselo como lo requiere..

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Llamada a Procedimiento Oracle

Publicado por Toni (1 intervención) el 09/11/2008 03:10:41
Has comprobado que el tipo de fecha-hora sea DATETIME, o bien DATETIME2 ?
Cambia la precisión.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar