C# InvalidOperationException:当不存在数据时,读取尝试无效。(SQL)
我不明白为什么我会得到它。我想做的就是找到最后一个发帖子的人。。我看了一下调试,事情似乎很好。我还研究了VisualStudio2010中的sql server。。有数据,但不知何故,它没有被读取,并引发异常…:(在访问值之前,您应该检查dr.Read():C# InvalidOperationException:当不存在数据时,读取尝试无效。(SQL),c#,sql,invalidoperationexception,C#,Sql,Invalidoperationexception,我不明白为什么我会得到它。我想做的就是找到最后一个发帖子的人。。我看了一下调试,事情似乎很好。我还研究了VisualStudio2010中的sql server。。有数据,但不知何故,它没有被读取,并引发异常…:(在访问值之前,您应该检查dr.Read(): void ExecuteContent() { StringBuilder sb = new StringBuilder(); sb.Append("SELECT TOP 1 @UsersID,u.Avatar,t.
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());
}
}
您必须通过您的阅读器循环:
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());
}
或者if(dr.Read())
如果只有一个结果
及
您应始终使用以下工具围绕您的读者:
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());
}
在调用ToString()之前,应该进行一些空检查
这里有一个用代码编写查询的小技巧,使用逐字记录:
ThreadParagraph = dr["ThreadParagraph"] == null ? "" : dr["ThreadParagraph"].ToString();
此外,您应该检查是否有任何结果:if(dr.HasRows){…Peter,我更喜欢使用dr.Read..但我知道我在数据库中有数据。因为我输入了它,看到了你所说的逐字翻译是什么意思..为什么你要使用var查询而不是stringbuilder?var查询是一个字符串。在这里查看有关逐字翻译符号的更多信息:我在属性中得到null..好像数据库中没有任何内容..我为ThreadPara得到nullgraph和其他…我看到了问题所在…出于某种原因,我在一个insert语句中遇到了一个问题,但我没有在这里出现。它起作用了…但现在它停止了作用..我需要检查原因:(…感谢帮助…我做了一个DBnull.Value.Equals(dr[“Image”])和更多的空检查
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";