2013-06-11 5 views
1

То, что я пытаюсь сделать, это захватить текущее имя пользователя и сравнить его с базой данных, которая содержит пользователей, а также включает флаг Active и флаг администратора. Я хочу сравнить текущего зарегистрированного пользователя в таблице tbl_Person и их соответствующих пользователей в таблице, чтобы увидеть, отмечены ли они как Active и Admin. Если оба они верны, они получают доступ к странице администратора. У меня есть до сих пор, что не работает. Некоторые из них я знаю, почему, а некоторые нет. Я думаю, что нахожусь на правильном пути, что, как я сказал, я уверен, что я делаю это неправильно. Я знаю, что вы используете ExecuteScalar(), чтобы возвращать что-то вместе с OUTPUT в строке запроса, но не могли заставить это работать. Другая вопиющая проблема заключается в том, что я пытаюсь вернуть целые числа, когда имя пользователя является строкой, а активные и админ-флаги - это Bools. Я знаю, что у меня только Актив, есть момент. Я пытался заставить это работать, прежде чем добавлять что-то еще.Сравнение с значением базы данных

Я прочитал, что с помощью ExecuteScalar вы можете анализировать и преобразовывать ToString, но это не сработало, и я нашел доказательства того, что это может быть неправильной задачей, но я действительно не уверен.

У меня есть несколько разных ошибок. Введите ошибки, недопустимый столбец, когда я попытался выполнить OUTPUT. С OUTPUT я пробовал как только OUTPUT, и потому, что я знаю, когда возвращаюсь после вставки, вы вставляете insert.name. Я попробовал selected.name как догадка, но это не сработало.

Я думал, что, если я вытащил информацию, объединил их, а затем сделал сравнение, что это будет делать то, что я хочу, но я открыт для других предложений. Благодарю.

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString); 
conn.Open(); 
SqlCommand sqlUserName = new SqlCommand("SELECT [username] FROM [tbl_Person]", conn); 
SqlCommand sqlActive = new SqlCommand("SELECT [active] FROM [tbl_Person]", conn); 
int result1 = ((int)sqlUserName.ExecuteScalar()); 
int result2 = ((int)sqlActive.ExecuteScalar()); 

string userInfo = result1 + "." +result2; 
string userName = userName + "." +result2; 

if (userInfo == userName) 
{ 
    Woo, you have access. 
} 
else 
{ 
    Sorry, but no. 
} 

Запрос также не является окончательным. Как только он будет работать, я изменю его на параметризованный запрос.

+0

Вам нужно вернуться к основам SQL и клиентских библиотек SQL. Вероятно, вы хотите, чтобы предложение WHERE выбрало только одну строку из таблицы. 'ExecuteScalar()' - это когда запрос возвращает одно значение, например. 'select count (*) from ...', в противном случае он вернет первый столбец первой строки набора результатов. В вашем случае это будет флаг 'username' и' active' из существенно произвольно выбранной строки. Также не являются 'int'. – millimoose

+0

Голосование закрывается как TL, так как с кодом больше неправильного. Соберите свои мысли в первую очередь и дойдете до точки, когда вы знаете, что проблема * one *, * specific *, которая блокирует ваш прогресс прямо сейчас, и задайте вопрос, где демонстрируется эта одна проблема. (Включая сообщения об ошибках и т. Д.) Вместо того, чтобы размещать блок по существу бессмысленного кода и просить кого-то выпрямить то, что вы догадываетесь, но не совсем точно определили проблемы. – millimoose

+0

И как, черт возьми, я хотел сделать это без какого-либо руководства? Я не прошу людей исправить это для меня, но чтобы помочь мне, где я ошибаюсь. – Trido

ответ

1

Хорошо, рассмотрим следующий код:

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand("SELECT [active] FROM [tbl_Person] WHERE username = @username", conn)) 
    { 
     // since we can literally filter the results, if something comes back 
     // we know they are registered 
     cmd.Parameters.AddWithValue("@username", userName); 

     var res = cmd.ExecuteScalar(); 
     bool registeredAndActive = (bool)res; 

     // unless of course `[active]` is an INT -then do this 
     bool registeredAndActive = (int)res == 1 ? true : false; 

     // but really -set [active] up as a BIT if it's not **and** 
     // please make it non-nullable :D 
    } 
} 

Я уверен, что он делает то, что вы хотите. Но это также показывает некоторые лучшие практики, как:

  1. Кредитное плечо using заявление для всех IDisposable объектов.
  2. Отфильтруйте запрос как можно больше и совершите только одно путешествие в оба конца.
+0

Клянусь, ты мой новый лучший друг. Спасибо за это. Я весь день пытаюсь понять это, я действительно ударяю головой о стол. Попытка найти материал в сети также была довольно расстраивающей, потому что она предполагает так много знаний, поэтому я вернулся к основам RE, что другой вопрос. – Trido

+1

@Trido, не беспокойтесь. Время от времени сообщество может стать жестким, но не сдаваться, это действительно лучшее в сети.Многие программисты здесь забыли, где они начали - это происходит с лучшими из нас. –

Смежные вопросы