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


0