Hi,
We have a legacy database with lot of business logic placed in stored procedures. When we generates the DAL layer we encounter problem with the parameters to the stored procedures. They are specified as NUMBER (unconstrained) so they are able to accept decimal number as well as integer. But the code generator produce parameter types with precision 22 and scale 0:
parameters[0] = new OracleParameter("PWEIGHT1", OracleDbType.Decimal, 0, ParameterDirection.Input, true, 22, 0, "", DataRowVersion.Current, pweight1);
meaning big integer type so no decimal values are being saved - just truncated to integers. Found a thread about it and you stated that no meta data are given so LLBLGen just translate it to that type. http://www.llblgen.com/tinyforum/Messages.aspx?ThreadID=14405
First question: Is it possible to somehow control the code generation tool to specify
the precision and scale for stored procedures? We have a lot of procedures to call...
We also tried to change the stored procedure´s parameter type to the table's type (FLOAT) it is working on to try work around the problem with meta data. But this resulted in following truncate exception when calling the stored procedure from LLBLGen. It seems that LLBLGen translated the type to precision 38, scale 127 - but if we look at the entity directly it has precision 38, scale 38.
So it seems to be a problem with Oracle FLOAT parameter types?
How should we proceed?
We are running LLBLGen 2.6 Final September 12th, 2008, Oracle 10g/11g Driver (ODP.NET 10.2.x) Driver version 2.6.08132008
Type: Oracle.DataAccess.Types.OracleTruncateException, kapat resultat
StackTrace: at Oracle.DataAccess.Types.OracleDecimal.ConvertToPrecScale(OracleDecimal value1, Int32 precision, Int32 scale)
at Oracle.DataAccess.Client.OracleParameter.PreBind_Decimal()
at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
at LFS.DAL.DatabaseSpecific.DataAccessAdapter.CallActionStoredProcedure(String storedProcedureToCall, OracleParameter[] parameters) in C:\Project\LFS\Source\LFS.DAL\DatabaseSpecific\DataAccessAdapter.cs:line 177
at LFS.DAL.DatabaseSpecific.ActionProcedures.NewtwowirefeederTwowirefeedercharged(Decimal pweight1, Decimal pweight2, Decimal pweight3, Decimal pweight4, Decimal pweight5, Decimal pweight6, Decimal pweight7, Decimal pweight8, DataAccessAdapter adapter) in C:\Project\LFS\Source\LFS.DAL\DatabaseSpecific\ActionProcedures.cs:line 7749
at LFS.BL.Managers.BinMgr.ExecuteNewtwowirefeederTwowirefeedercharged(WireFeedingData data) in C:\Project\LFS\Source\LFS.BL\Managers\BinMgr.cs:line 308
at LFS.BL.Managers.BinMgr.RegisterWireFeedingData(WireFeedingData data) in C:\Project\LFS\Source\LFS.BL\Managers\BinMgr.cs:line 71
at LFS.Events.ProcessEvents.WireFeedingEndedEvent.OnEventArrived() in C:\Project\LFS\Source\LFS.BL\Events\ProcessEvents\WireFeededEndedEvent.cs:line 49
at LFS.BL.Managers.EventMgr.OnEventArrived(ILFSEvent evt) in C:\Project\LFS\Source\LFS.BL\Managers\EventMgr.cs:line 20
at LFS.BL.Service.EventQueueService`1.PerformWork(Object stateInfo) in C:\Project\LFS\Source\LFS.BL\Services\EventQueueService.cs:line 133
This is the stored procedure in PL-SQL:
PROCEDURE TwoWireFeederCharged(pWeight1 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight2 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight3 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight4 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight5 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight6 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight7 IN LFS_FBD_ADD1.WEIGHT%TYPE,
pWeight8 IN LFS_FBD_ADD1.WEIGHT%TYPE)
IS ....
This is the table the procedure working on, weight column:
CREATE TABLE "LFS"."LFS_FBD_ADD1"
( "HEAT_NUMBER" NUMBER(10,0),
"WSTEP" NUMBER(5,0),
"ORDER_SEQUENSE" NUMBER(5,0),
"MAT_CODE" NUMBER(10,0),
"WEIGHT" FLOAT(126),
"BIN_ID" NUMBER(5,0),
"UPD_DAT" DATE,
"MAN_CHARGED" NUMBER(1,0) DEFAULT 0,
CONSTRAINT "LFS_FBD_ADD1_PK" PRIMARY KEY ("HEAT_NUMBER", "WSTEP", "ORDER_SEQUENSE") ENABLE
) ;
This is the generated code:
public static int NewtwowirefeederTwowirefeedercharged(System.Decimal pweight1, System.Decimal pweight2, System.Decimal pweight3, System.Decimal pweight4, System.Decimal pweight5, System.Decimal pweight6, System.Decimal pweight7, System.Decimal pweight8, DataAccessAdapter adapter)
{
OracleParameter[] parameters = new OracleParameter[8];
parameters[0] = new OracleParameter("PWEIGHT1", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight1);
parameters[1] = new OracleParameter("PWEIGHT2", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight2);
parameters[2] = new OracleParameter("PWEIGHT3", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight3);
parameters[3] = new OracleParameter("PWEIGHT4", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight4);
parameters[4] = new OracleParameter("PWEIGHT5", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight5);
parameters[5] = new OracleParameter("PWEIGHT6", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight6);
parameters[6] = new OracleParameter("PWEIGHT7", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight7);
parameters[7] = new OracleParameter("PWEIGHT8", OracleDbType.Decimal, 22, ParameterDirection.Input, true, 38, 127, "", DataRowVersion.Current, pweight
;
int toReturn = adapter.CallActionStoredProcedure("LFS.NEWTWOWIREFEEDER.TWOWIREFEEDERCHARGED", parameters);
....