0

I have a sybase DB which fetches results of a query properly as below...

select   
    S.ipoInternalID,  
    clientAccount,  
    clientPrice,  
    clientAccountType,  
    interestOnLoan = 
               CASE WHEN useHIBOR = 1 then  
                    ROUND(financingAmount * (fixedRate + spreadRate) * 
                            I.noOfDaysForInterest/365/100,2)
               ELSE 
                    ROUND(financingAmount * (I.fundingRate+ spreadRate) * 
                           I.noOfDaysForInterest/365/100,2) END,
    useHIBORSTR = 
               CASE WHEN useHIBOR = 1 then
                    "LOCK-IN RATE + SPREAD" 
               ELSE
                    "COST OF FUNDING + SPREAD" END,
from subscription S, iPO I, allocation A  
where   
            S.ipoInternalID = @ipoInternalID  and  
            I.ipoInternalID = @ipoInternalID  and  
            A.ipoInternalID = @ipoInternalID  and
            S.ccassID *= A.ccassID  
order by  S.ccassID 

Notice the way interestOnLoan field is calculated above.

Now when I run this query in SQL Advantage tool, it runs fine and gives me calculated values for interestOnLoan. When I run this query using .Net 1.1 API that loads this query via OleDB it runs fine...

myCommand.CommandText = myQuery;
myAdapter.SelectCommand = myCommand;
int i = myAdapter.Fill(resultSet);

My resultset fills ok.

But when I execute the above code in .net 4.0, the resultset errors out as

"Value was either too large or too small for a Decimal."

The value it has issues with is the interestOnLoan because I also executed the command via IDataReader as below...

  using (var dr = myCommand.ExecuteReader())
  {
         resultSet.Tables.Add(ConvertDataReaderToTableManually(dr));
  }

private static DataTable ConvertDataReaderToTableManually(IDataReader dr) {
    var dt = new DataTable();
    var dtSchema = dr.GetSchemaTable();
    var listCols = new List<DataColumn>();

    if (dtSchema != null) {
        foreach (DataRow drow in dtSchema.Rows) {
        var columnName = Convert.ToString(drow["ColumnName"]);
        var t = (Type) (drow["DataType"]);
        var column = new DataColumn(columnName, t);
        column.Unique = (bool) drow["IsUnique"];
        column.AllowDBNull = (bool) drow["AllowDBNull"];
        column.AutoIncrement = (bool) drow["IsAutoIncrement"];
        listCols.Add(column);
        dt.Columns.Add(column);
        }
    }

    // Read rows from DataReader and populate the DataTable
    int j = 0;

    while (dr.Read()) {
        j++;
        var dataRow = dt.NewRow();
        for (int i = 0; i < listCols.Count; i++) {
        try {
            dataRow[((DataColumn)listCols[i])] = dr[i];
        } catch (Exception ex1) { }         
        }
        dt.Rows.Add(dataRow);
    }

    return dt;
    }

Here it errors out at the dataRow[((DataColumn)listCols[i])] = dr[i] where it has issues reading from dr[i];

When observed the ith column is nothing but interestOnLoan.

So somehow .Net 4.0 is not able to read this value. It can read other decimal values correctly such as clientPrice.

Why could this be happening....

Also I wanted to ask is there any way I can load the values in the DataReader as Double (instead of Decimal) by default?

WPF-it
  • 19,625
  • 8
  • 55
  • 71

1 Answers1

0

I didnt get the reason why .NET 4.0 had issues ith the above query but when I changed the query as below it worked in both (.Net 1.1 and 4.0)

select   
  S.ipoInternalID,  
  clientAccount,  
  clientPrice,  
  clientAccountType,  
  interestOnLoan = ROUND(
     (CASE WHEN useHIBOR = 1 THEN
           ((financingAmount*(fixedRate + spreadRate) * .noOfDaysForInterest)/365.0)
           ELSE 
           ((financingAmount*(I.fundingRate+spreadRate)*I.noOfDaysForInterest)/365.0)
     END) / 100.0, 2),
  useHIBORSTR = 
                   CASE WHEN useHIBOR = 1 then
                   "LOCK-IN RATE + SPREAD" 
                   ELSE
                  "COST OF FUNDING + SPREAD" END,
 from subscription S, iPO I , allocation A  
 where   
                S.ipoInternalID = @ipoInternalID  and  
                I.ipoInternalID = @ipoInternalID  and  
                A.ipoInternalID = @ipoInternalID  and
                S.ccassID *= A.ccassID  
 order by  S.ccassID
WPF-it
  • 19,625
  • 8
  • 55
  • 71