InvalidOperationException:当不存在数据时,读取尝试无效.(SQL)
本文关键字:无效 SQL 读取 不存在 数据 InvalidOperationException | 更新日期: 2023-09-27 17:59:09
void ExecuteContent()
{
StringBuilder sb = new StringBuilder();
sb.Append("SELECT TOP 1 @UsersID,u.Avatar,t.Date, u.Name, t.ThreadTitle, t.ThreadParagraph");
sb.Append(" FROM Users as u");
sb.Append(" INNER JOIN Threads as t ON u.UsersID = t.UsersID");
sb.Append(" Where @UsersID=t.UsersID");
sb.Append(" ORDER BY t.Date DESC");
using (SqlConnection conn = new SqlConnection(AnswerQuestion.connectionString))
{
conn.Open();
SqlCommand sqlComm = new SqlCommand(sb.ToString(), conn);
MembershipUser CurrentUser = Membership.GetUser();
Guid i = (Guid)CurrentUser.ProviderUserKey;
sqlComm.Parameters.Add("@UsersID", SqlDbType.UniqueIdentifier).Value = i;
SqlDataReader dr = sqlComm.ExecuteReader();
UserName = dr["Name"].ToString();//The exception is thrown here
Image = (Image) dr["Avatar"];
ThreadTitle = dr["ThreadTitle"].ToString();
ThreadParagraph = dr["ThreadParagraph"].ToString();
Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString());
}
}
我不明白我为什么收到它。我所要做的就是找到最后一个发帖子的人。。我看了调试,一切似乎都很好。我还查看了visualstudio 2010中的sql服务器。有数据,但不知怎么的,它没有被读取,并且抛出了一个异常…:(
在访问值之前,您应该检查dr.Read((:
if(dr.Read())
{
UserName = dr["Name"].ToString();//The exception is thrown here
Image = (Image) dr["Avatar"];
ThreadTitle = dr["ThreadTitle"].ToString();
ThreadParagraph = dr["ThreadParagraph"].ToString();
Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString());
}
您必须通过阅读器循环:
while(dr.Read())
{
serName = dr["Name"].ToString();//The exception is thrown here
Image = (Image) dr["Avatar"];
ThreadTitle = dr["ThreadTitle"].ToString();
ThreadParagraph = dr["ThreadParagraph"].ToString();
Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString());
}
或if(dr.Read())
,如果您只有一个结果
而且你应该总是围绕你的阅读器使用:
using(dr)
{
while(dr.Read())
{
}
}
在调用ToString((之前,您应该进行一些null检查;
ThreadParagraph = dr["ThreadParagraph"] == null ? "" : dr["ThreadParagraph"].ToString();
这里有一个用代码编写查询的小技巧,逐字逐句使用:
var query = @"SELECT TOP 1 @UsersID,u.Avatar,t.Date, u.Name, t.ThreadTitle, t.ThreadParagraph
FROM Users as u
INNER JOIN Threads as t ON u.UsersID = t.UsersID
Where @UsersID=t.UsersID ORDER BY t.Date DESC";