You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取数据表中最新的10条记录?当前仅返回前10条

解决方法:获取最新10条银行卡交易记录并按正常顺序展示

你的代码当前存在两个关键问题:一是未按交易时间排序,无法获取最新记录;二是存在SQL注入风险,且代码内手动限制条数的方式不够高效。以下是具体修改方案:

1. 修改SQL查询逻辑,精准获取最新10条记录

原SQL未指定排序规则,返回的是数据库默认存储顺序,并非最新交易。我们需要先按DataHora(交易时间)降序取最新10条,若要按“正常顺序”(时间从早到晚)展示,可再将这10条按时间升序排列。同时改用参数化查询彻底避免SQL注入风险。

修改extratoOperacao方法:

private static IEnumerable<string> extratoOperacao(string numeroCartao)
{
    // 子查询取最新10条,外层排序为时间正序(早→晚)
    string query = @"SELECT CardNumber, Deposit, Withdraw, DataHora 
                    FROM (
                        SELECT TOP 10 CardNumber, Deposit, Withdraw, DataHora 
                        FROM MoveInfo 
                        WHERE CardNumber = @CardNumber 
                        ORDER BY DataHora DESC
                    ) AS LatestTransactions
                    ORDER BY DataHora ASC";
    return getExtrato(query, numeroCartao);
}

2. 优化getExtrato方法,支持参数化并移除冗余限制

原方法中手动限制result.Count <=9的逻辑可以移除(SQL已控制返回10条),同时添加参数绑定逻辑,修正字段类型转换的潜在问题:

private static IEnumerable<string> getExtrato(string query, string numeroCartao)
{
    using (var cn = new SqlConnection("Data Source=MAD-PC-023\\SQLEXPRESS;Database=bank;Trusted_Connection=True;"))
    {
        cn.Open();
        using (var cmd = new SqlCommand(query, cn))
        {
            // 绑定参数,避免SQL注入
            cmd.Parameters.AddWithValue("@CardNumber", numeroCartao);
            
            var reader = cmd.ExecuteReader();
            var result = new List<string>();
            
            while (reader.Read())
            {
                // 改用数值类型读取金额,避免字符串转换错误
                decimal deposit = reader.GetDecimal(1);
                decimal withdraw = reader.GetDecimal(2);
                DateTime transactionTime = reader.GetDateTime(3);
                string cardNumber = reader.GetString(0);

                if (withdraw > 0)
                {
                    result.Add($"\n  O cartão nº {cardNumber} levantou: {withdraw} euros, às: {transactionTime}");
                }
                else if (deposit > 0)
                {
                    result.Add($"\n  O cartão nº {cardNumber} depositou: {deposit} euros, às: {transactionTime}");
                }
            }
            return result;
        }
    }
}

额外说明

  • 排序调整:若你需要的“正常顺序”是从最新到最旧展示,直接移除外层的ORDER BY DataHora ASC即可,保留子查询的ORDER BY DataHora DESC返回的结果就是最新在前的10条。
  • 字段逻辑修正:原代码用reader.GetString(1)=="0"判断存取款,存在类型转换风险。改用GetDecimal读取金额字段,通过数值是否大于0来区分存取款,逻辑更准确。

内容的提问来源于stack exchange,提问作者user20571251

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:20:31