如何在数据库中检查空值

时间:2014-06-16 13:51:01

标签: mysql asp.net

我在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;当没有数据存在时读取无效"。 我该如何解决这个问题?

3 个答案:

答案 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
}