如何从DataReader中使用小数获取数字值

时间:2018-10-30 13:12:44

标签: c# int decimal

根据下面的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"));

4 个答案:

答案 0 :(得分:0)

由于您需要以Decimal对象的形式获取值,因此您需要使用SqlDataReader.GetDecimal(Int32)方法:

readerCASH.GetDecimal(readerCASH.GetOrdinal("Cash"));

因为GetInt32方法将以32位带符号整数形式获取值。另外,您需要将TOCASH的类型更改为十进制。另外,您应始终使用parameterized queries来避免SQL Injection。像这样:

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/

答案 1 :(得分:0)

如果您想获得GetInt32的价值,请不要使用decimal,请使用GetDecimal

PDC.TOCASH = readerCASH.GetDecimal(readerCASH.GetOrdinal("Cash"));

答案 2 :(得分:0)

如果您不确定将哪种 .Net 类型映射到初始的 RDBMS 类型(例如Number(16, 4) -> ?,它将是{ {1}},SingleDouble?),您可以尝试转换

Decimal

答案 3 :(得分:0)

您正在将其格式化为不带逗号,因此它将以整数形式返回

PDC.CASH += String.Format("{0:n2}",readerCASH["Cash"]);

n2表示逗号后还有2位数字,如果您使用的是货币,我建议您使用{0:c2}