G_ID是Groups表中的整数列。我想要它的最大值。当我跟踪代码时,我收到了代码中提到的错误。在调试期间,Reader.HasRows等于true。那么为什么它说“没有数据存在”
SqlConnection sqlc= new SqlConnection("data source=. ; database=LDatabase; integrated security=true");
SqlCommand cmd= new SqlCommand("select MAX(G_ID) as MAXID from Groups", sqlc);
sqlc.Open();
SqlDataReader Reader= cmd.ExecuteReader();
int MaxID = 0;
if (Reader.HasRows)
{
MaxID = Convert.ToInt32(Reader["MAXID"].ToString());// Here I receive this error: System.InvalidOperationException: Invalid attempt to read when no data is present.
MaxID += 1;
}
答案 0 :(得分:3)
在访问DataReader之前,您需要调用方法Read以将阅读器放在第一条记录上
SqlConnection sqlc= new SqlConnection("data source=. ; database=LDatabase; integrated security=true");
SqlCommand cmd= new SqlCommand("select MAX(G_ID) as MAXID from Groups", sqlc);
sqlc.Open();
SqlDataReader Reader= cmd.ExecuteReader();
int MaxID = 0;
if (Reader.Read())
{
MaxID = Convert.ToInt32(Reader["MAXID"].ToString());
MaxID += 1;
}
顺便说一句,你的查询只返回数据库中的一行和一列,所以更好的方法是使用ExecuteScalar方法
SqlCommand cmd= new SqlCommand("select MAX(G_ID) as MAXID from Groups", sqlc);
sqlc.Open();
object result = cmd.ExecuteScalar();
if (result != null)
{
MaxID = Convert.ToInt32(result) + 1;
}
答案 1 :(得分:0)
您正在检查阅读器是否有行,但您没有阅读它们。这样做(注意我也包装东西以确保它们被妥善处理):
SqlConnection sqlc= new SqlConnection("data source=. ; database=LDatabase; integrated security=true");
SqlCommand cmd = new SqlCommand("select MAX(G_ID) as MAXID from Groups", sqlc);
sqlc.Open();
try {
using (SqlDataReader reader = cmd.ExecuteReader()) {
int MaxID = 0;
while (reader.Read()) {
MaxID = Convert.ToInt32(Reader["MAXID"].ToString());
MaxID += 1;
}
}
}
finally {
sqlc.Close();
}