繁体   English   中英

如何从DataReader获取带有十进制的数字值

[英]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) -> ?SingleDouble还是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM