1

下面是我想获取最后一个条目的查询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;
4

2 回答 2

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 , the ethos are - check for nulland DbNull.Valuebefore trying to convert to an Int32.

于 2013-10-16T08:15:46.617 回答
1

将 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);
}
于 2013-10-16T08:21:52.370 回答