以下是我的查询我想要获取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;
答案 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.Value
和Int32
。
答案 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);
}