我在asp.net工作。我希望如果用户没有上传他的个人资料图片,那么他应该被重定向到个人资料图片上传页面'。为此,我们必须检查数据库以查看该用户是否存在User_ID
。如果数据库中不存在,则意味着他尚未上传。否则,这意味着他已经上传了一张图片,并且该页面加载了所有用户的信息。我有一个用于保存显示图片的表格:
表:ProfilePic
Columns= ID DP User_ID
要检查他的user_id是否存在于数据库中,我使用以下代码:
str = "select * from ProfilePic where Profile_ID=" + userid + ";";
cmd = new SqlCommand(str, con);
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
if (reader["Profile_ID"] != DBNull.Value)
{
LoadInfo();
LoadData();
}
else
{
Response.Redirect("DP.aspx");
}
但它还在说#34;当没有数据存在时读取无效"。 我该如何解决这个问题?
答案 0 :(得分:1)
您可以检查阅读器中的行,如下例所示:
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
答案 1 :(得分:1)
你说,"如果该用户的User_ID在数据库中不存在,则意味着他尚未上传。"这意味着当您运行查询时,它将返回记录或者它不会。如果它没有,那么在其中一个字段中寻找空值注定要失败。
我从Bjorn的回答中看到SqlDataReader有一个HasRows属性。用它。
答案 2 :(得分:0)
首先,避免:
Select * ...
当你想要做的就是检查特定表中是否存在特定值。从性能的角度来看,它对于您的寻找并没有任何好处。
现在,回答你的问题,没有使用select * from
。您需要知道的是,表中是否存在userID。你看,这是一个真实或错误的场景。您的查询也应该设计为反映这一点。因此,基本上您的查询本身应该返回true或false,并且基于此应该能够应用您的业务规则。您也可以只使用SELECT COUNT()
。这就是我建议您设计查询的方式:
string str = "SELECT CAST(COUNT(Profile_Id) AS bit) As 'DoesUserIDexist' FROM ProfilePic WHERE Profile_Id = 4";
您还可以使用:
string str = "SELECT COUNT(Profile_Id) As 'DoesUserIDexist' FROM ProfilePic WHERE Profile_Id = 4";
此外,当您需要从数据库中读取时,使用try catch始终是一个好习惯。
基本上,您的代码可以简化为:
string query = "SELECT CAST(COUNT(Profile_Id) AS bit) As 'DoesUserIDexist' FROM ProfilePic WHERE Profile_Id = 4";
cmd = new SqlCommand(query, con);
try
{
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
LoadInfo();
LoadData();
}
else
{
Response.Redirect("DP.aspx");
}
}
catch
{
//Your exception handling mechanism here
}
finally
{
//Dispose your ADO.NET related objects here
}