Как проверить наличие нулевого значения в базе данных

#mysql #asp.net

#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");
       }
  

Но он по-прежнему говорит «Недопустимая попытка чтения при отсутствии данных».
Как мне решить эту проблему?

Комментарии:

1. is null or not is null вот в чем вопрос.

2. Я согласен с Джодреллом. Кроме того, не существует такой вещи, как «нулевое значение». Если значение равно нулю, значения нет.

3. Согласен с вашей логикой

Ответ №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();
  

Ответ №2:

Вы говорите: «Если идентификатор пользователя этого пользователя не существует в базе данных, это означает, что он еще не загружен». Это означает, что когда вы выполняете свой запрос, он либо вернет запись, либо нет. Если этого не произойдет, поиск нулевого значения в одном из полей обречен на неудачу.

Из ответа Бьорна я вижу, что SqlDataReader имеет свойство HasRows . Используйте это.

Комментарии:

1. Да, вы правильно поняли. Хорошо, я попробую ваше предложение

2. 1 За объяснение, хотя я ожидал, что вы предоставите OP более подробный ответ, включая рекомендации!!

Ответ №3:

Прежде всего, избегайте:

 Select * ...
  

когда все, что вы хотите сделать, это проверить, существует ли определенное значение или нет в определенной таблице. Это не имеет никакого преимущества в отношении того, что вы ищете, и не очень хорошо с точки зрения производительности.

Теперь, возвращаясь к вашему вопросу, бесполезно select * from . Все, что вам нужно знать, это существует ли идентификатор пользователя в таблице или нет. Видите ли, это сценарий true или false. Ваш запрос также должен быть разработан с учетом этого. Итак, по сути, сам ваш запрос должен возвращать true или false, и на основе этого вы должны иметь возможность применять свои бизнес-правила. Вы также можете использовать just 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
}