首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ExecuteScalar()代替ExecuteReader()

使用ExecuteScalar()代替ExecuteReader()
EN

Stack Overflow用户
提问于 2017-06-11 18:36:07
回答 1查看 183关注 0票数 1

我正在学习Web,并在做一个小项目(我知道这个问题与Web无关,只是为了达到目的)。因此,我有一个名为get_balance(string accountNumber)的函数,它返回余额:

代码语言:javascript
复制
-- Function: deposit.get_balance(character varying)
-- DROP FUNCTION deposit.get_balance(character varying);

CREATE OR REPLACE FUNCTION deposit.get_balance
     (deposit_account_number_ character varying)
RETURNS money AS
$BODY$
DECLARE _account_number_id bigint;
BEGIN

SELECT account_number_id INTO _account_number_id FROM 
deposit.account_holders WHERE account_number = $1;
RETURN(
SELECT 
SUM(COALESCE(credit,'0')) - SUM(COALESCE(debit, '0'))
FROM deposit.transaction_view
WHERE account_number_id = _account_number_id
);
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION deposit.get_balance(character varying)
OWNER TO postgres;

因为这是一个Web项目,所以我有一个AccountsController

代码语言:javascript
复制
[HttpPost]
[ActionName("balance")]
public IHttpActionResult GetBalance([FromBody]AccountBalance account)
{
    account = BusinessLayer.Api.AccountHolderApi.GetBalance(account.AccountNumber);
    return Ok(account);
}

业务层:

代码语言:javascript
复制
public static AccountBalance GetBalance(string AccountNumber)
{
    return DatabaseLayer.Api.AccountHolderApi.GetBalance(AccountNumber);
}

Db层:

代码语言:javascript
复制
public static AccountBalance GetBalance(string AccountNumber)
{
    AccountBalance result = null;

    using (var conn = new NpgsqlConnection("Server=localhost;UserId = postgres; " + "Password = pes; Database = pmc; "))
    {
        conn.Open();

        using (var command = new NpgsqlCommand("SELECT * FROM deposit.get_balance(@AccountNumber);", conn))
        {
            command.Parameters.AddWithValue("@AccountNumber", AccountNumber);

            using (var dr = command.ExecuteReader())
            {
                if(dr.HasRows && dr.Read())
                {
                    result = new AccountBalance
                    {
                        AccountNumber = AccountNumber,
                        Balance = dr["get_balance"].ToString(),
                    };
                }
            }
        }

        return result;
    }
}

从现在起,一切正常,我得到了预期的结果。

代码语言:javascript
复制
{
    "accountNumber": "RD-0000050",
    "balance": "1100"
}

关于ExecuteScalar,我学到的是,它只返回查询第一行第一列的值。我的查询只返回一个列,并且我尝试使用ExecuteScalar进行一些tuts,但是遗憾的是,没有做到这一点。如何在这个场景中使用ExecuteScalar?任何详细的链接,解释都是有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-11 18:41:52

下面是如何使用ExecuteScalar而不是ExecuteReader

代码语言:javascript
复制
using (var command = new NpgsqlCommand("SELECT get_balance FROM deposit.get_balance(@AccountNumber);", conn)) {
    command.Parameters.AddWithValue("@AccountNumber", AccountNumber);
    var balanceObj = command.ExecuteScalar();
    string balance = balanceObj != DBNull.Value ? balanceObj.ToString() : "<EMPTY>";
    return new AccountBalance {
        AccountNumber
    ,   Balance = balance
    };
}
return null;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44487353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档