以下のように、クエリの結果を適切にフェッチするsybase DBがあります...
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
interestOnLoan
上記のフィールドの計算方法に注意してください。
このクエリを SQL Advantage ツールで実行すると、正常に実行され、 の計算値が得られますinterestOnLoan
。OleDB 経由でこのクエリをロードする .Net 1.1 API を使用してこのクエリを実行すると、正常に実行されます...
myCommand.CommandText = myQuery;
myAdapter.SelectCommand = myCommand;
int i = myAdapter.Fill(resultSet);
私の結果セットは大丈夫です。
しかし、.net 4.0 で上記のコードを実行すると、結果セットは次のようにエラーになります。
「Decimal に対して値が大きすぎるか小さすぎます。」
問題のある値は、以下のようinterestOnLoan
にコマンドも実行したためIDataReader
です...
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;
}
ここでは、 dr[i] からの読み取りdataRow[((DataColumn)listCols[i])] = dr[i]
に問題がある場所でエラーが発生します。
観察されたとき、i
th 列は InterestOnLoan に他なりません。
したがって、どういうわけか.Net 4.0はこの値を読み取ることができません。などの他の 10 進数値を正しく読み取ることができますclientPrice
。
どうしてこうなるのか……。
DataReader
また、デフォルトでas Double
(の代わりに)に値をロードする方法はありDecimal
ますか?