如何获取特定ID的最后一个条目

时间:2013-10-16 08:09:53

标签: c# sql ms-access

以下是我的查询我想要获取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;

2 个答案:

答案 0 :(得分:4)

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,其原则是 - 在尝试转换为null之前检查DbNull.ValueInt32

答案 1 :(得分:1)

将SQL语句更改为beloe

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

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

var maxVisit = cmd.ExecuteScalar();

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