【问题标题】:How to get Last entry of Particular ID如何获取特定 ID 的最后一个条目
【发布时间】:2013-10-24 06:15:55
【问题描述】:

下面是我的查询,我想获取 visitno 的最后一个条目,特别是 pid,这个查询工作正常,但选择了 pid 的所有行,visistNo is of Number Datatype

public int GetPatientID_visitNo(int pid)
    {
        int data = 0;
        try
        {
            string sql = "Select VisitNo From Patient_Visit_Details where Patient_ID = " + pid;
            cmd = new OleDbCommand(sql, acccon);
            rs = cmd.ExecuteReader();
            if (rs.HasRows)
            {
                data = Convert.ToInt32(rs[0]);
            }
        }
        catch (Exception err)
        {
        }
        return data;
    }

当我在查询下面尝试时,它给了我错误no data exist,因为我的表是新的并且它不包含任何行,我该怎么做

string sql = "Select MAX(VisitNo) From Patient_Visit_Details where Patient_ID = " + pid;

【问题讨论】:

  • 这没有错误。那就用1吧。
  • 1 ?请进一步探索您的答案
  • 你需要 max() 值做什么?
  • 我想将 VisistNO 列作为特定 ID 的自动增量,所以我试图获取 visitNo 的最后一个条目,以便我可以将其递增 1

标签: c# sql ms-access


【解决方案1】:
string sql = string.Format(@"SELECT TOP 1 VisitNo
                             FROM patient_Visit_Details
                             WHERE Patient_ID = {0}
                             ORDER BY VisitNo DESC", pid);

此外,请为此使用cmd.ExecuteScalar()。检查没有行时的返回值。

还要注意,如果pid 来自您的应用程序之外的某个地方(例如网页),您的 sql 将对Injection attack 开放。

现在,正如已经指出的那样 - 如果没有行怎么办?在这里看到这个问题:Handling ExecuteScalar() when no results are returned,精神是 - 在尝试转换为 Int32 之前检查 nullDbNull.Value

【讨论】:

  • @juergend,如果我正确阅读了他的问题,他想要给定患者的最新(最高?)VisitNo?还是我读错了问题?
  • 问题是,如果给定的患者不存在任何价值,他就得不到结果。
【解决方案2】:

把SQL语句改成beloe

string sql = "Select ISNULL(MAX(VisitNo), 0)  From Patient_Visit_Details where Patient_ID = " + pid;

使用ExecuteScalar 并为空结果添加验证

var maxVisit = cmd.ExecuteScalar();

if (maxVisit != null && maxVisit != DBNull.Value) 
{
   data = Convert.ToInt32(maxVisit);
}

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2012-12-24
    • 2018-05-10
    • 2018-04-04
    • 1970-01-01
    • 2014-06-29
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多