如何获取数据表中最新的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
相关产品推荐
相关产品推荐

