[英]How to get number value with Decimal from DataReader
根据下面的SQL查询,我需要得到一个数值2083.10,但是当尝试使用代码从dbreader int值,这将是唯一在2083 demical
都不见了。
string SQLCash = @"SELECT sum(t2.Cash-Change) AS Cash
FROM dbFBHdr t1, dbFBCollection t2
WHERE t1.Branch = t2.Branch
AND t1.CashNo = t2.CashNo
AND t1.CashDate >= '" + PDC.DateFrom + "' " +
"AND t1.CashDate <= '" + PDC.DateTo + "' " +
"AND t1.Status = 'CLOSED'";
FbCommand cmdCASH = new FbCommand(SQLCash, FbCon);
cmdCASH.ExecuteNonQuery();
FbDataReader readerCASH = cmdCASH.ExecuteReader();
while (readerCASH.Read() == true)
{
if (readerCASH["Cash"].ToString() == "")
{
PDC.CASH = "0";
}
else
{
PDC.CASH += String.Format("{0:n}",readerCASH["Cash"]);
PDC.TOCASH = readerCASH.GetInt32(readerCASH.GetOrdinal("Cash"));
}
}
这是我用来从SQL获取Int值的代码
PDC.TOCASH = readerCASH.GetInt32(readerCASH.GetOrdinal("Cash"));
由于需要将值获取为Decimal
对象,因此需要使用SqlDataReader.GetDecimal(Int32)
方法代替:
readerCASH.GetDecimal(readerCASH.GetOrdinal("Cash"));
因为GetInt32
方法将以32位带符号整数获取值。 另外,您需要将TOCASH
的类型更改为十进制。 另外,您应始终使用参数化查询来避免SQL注入 。 像这样:
AND t1.CashDate >= @DateFrom
yourCommand.Parameters.AddWithValue("@DateFrom", PDC.DateFrom);
//And other parameters also
尽管直接指定类型并使用Value
属性比AddWithValue
。 看到这个https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
如果要获取decimal
值,请不要使用GetInt32
,请使用GetDecimal
PDC.TOCASH = readerCASH.GetDecimal(readerCASH.GetOrdinal("Cash"));
如果您不确定初始RDBMS映射到哪种.Net类型(例如Number(16, 4) -> ?
是Single
, Double
还是Decimal
?),则可以尝试转换 :
decimal result = Convert.ToDecimal(readerCASH["Cash"]);
您正在将其格式化为无逗号,因此将返回它为整数
PDC.CASH += String.Format("{0:n2}",readerCASH["Cash"]);
n2表示逗号后还有2位数字,如果您使用的是货币,我建议您使用{0:c2}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.