#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
}