Как получить числовое значение с помощью десятичного числа из DataReader - PullRequest
0 голосов
/ 30 октября 2018

В соответствии с приведенными ниже SQL-запросами мне нужно получить числовое значение 2083.10, но при попытке использовать код для получения значения int из dbreader будет только 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"));
    }
}

И это код, который я использую для получения значения Int из SQL

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

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

Вы форматируете его без запятых, поэтому оно будет возвращено как целое число

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

n2 означает 2 цифры после запятой, также я предлагаю вам использовать {0:c2}, если вы работаете с валютой

0 голосов
/ 30 октября 2018

Не используйте GetInt32, если хотите получить значение как decimal, используйте GetDecimal

PDC.TOCASH = readerCASH.GetDecimal(readerCASH.GetOrdinal("Cash"));
0 голосов
/ 30 октября 2018

Если вы не уверены , на какой тип .Net будет отображаться начальный RDBMS один (например, Number(16, 4) -> ? будет Single, Double или Decimal?) вы можете попробовать конвертировать :

   decimal result = Convert.ToDecimal(readerCASH["Cash"]);
0 голосов
/ 30 октября 2018

Поскольку вам нужно получить значение как объект 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/

...