Извлечение записи из хранимой процедуры в asp.net

#asp.net #stored-procedures

#asp.net #хранимые процедуры

Вопрос:

Я очень новичок в ASP.NET итак, я прошу прощения за наивный вопрос, но мне просто интересно, как мне извлечь данные из хранимой процедуры, которую я вызываю изнутри ASP.NET .Предполагается, что хранимая процедура возвращает одну строку, и я хочу получить возвращенные поля записи.

Итак, это то, к чему я пришел до сих пор

Хранимая процедура

 ALTER PROCEDURE dbo.StoredProcedure6

@LoginName varchar(50)

AS
 SELECT username ,Password  FROM dbo.Users
 Where username = @LoginName
RETURN
  

Код для получения доступа к конкретной записи в файле asp.net.cs

 var user = dbcontext.returnuserdetails(txtEmailAddress.Text); 
  

где returnuserdetails — это функция, которую я добавил через model browser в Visual studio 2010

Теперь вопрос в том, как мне получить и сохранить значения имени пользователя и пароля, которые возвращаются?

Я работаю в ASP.NET 4.0 если это поможет.

Спасибо

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

1. Что мы собираемся делать с информацией пользователя? Вам просто нужен способ идентификации пользователя после его входа в систему? Если это так, вы могли бы поместить user.username в сеанс.

2. @Andrew Charlton Ну, в настоящее время цель состоит в том, чтобы просто проверить, является ли имя пользователя, вводимое в поля формы, уникальным (я планирую сопоставить его с полученными данными, и если есть совпадение, выдать ошибку, указывающую, что имя пользователя уникально). Но в долгосрочной перспективе я планирую использовать пароль для целей аутентификации. Возможно, это не самый эффективный способ сделать это, но я все еще нахожу свой путь

3. Используете ли вы LINQ для SQL? Вы упомянули model browser. Если вы просто хотите проверить, существует ли имя пользователя, создайте функцию, которая явно выполняет это с подсчетом пользователей с введенным именем пользователя. Если результат больше 0, тогда выдается ошибка. Аутентификация может обрабатываться отдельно и более надежно.

4. Ну, я использую entity framework

Ответ №1:

если вы находитесь в версии 4.0, вы можете легко просто использовать LINQ to SQL, здесь хранимая процедура не нужна.

 private void GetUser(string emailAddress){

  using(DataContext dbcontext = new DataContext()){
    var AppData.user = dbcontext.users
             .Select(u => u.email_address == emailAddress).SingleOrDefault();

    // access entity properties as needed
    // user.email_address, user.first_name, etc..

  }    

}
  

Тем не менее, вы на самом деле не указываете, что именно вы пытаетесь сделать с объектом user, и пароли НИКОГДА не должны храниться в виде обычного текста.

если вы вынуждены использовать хранимые процедуры, то возвращаемым значением в LINQ-to-SQL всегда будет set.

 ALTER PROCEDURE dbo.ReturnUserDetails

@LoginName varchar(50)

AS
 SELECT * -- Get whole row so you have all info that is possibly needed  
 FROM dbo.Users
 Where username = @LoginName
RETURN
  

C# Код

 private void GetUser(string userName){

      using(DataContext dbcontext = new DataContext()){
        var user = dbcontext.ReturnUserDetails(userName).SingleOrDefault();

        // access entity properties as needed
        string userName =  user.username;
        var password = user.Password;

      }    
}
  

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

1. Спасибо, проблема в том, что администратор базы данных хочет, чтобы все были доступны как хранимые процедуры, поэтому я иду по этому пути. Тем не менее, пароли шифруются с использованием шифрования SHA1, прежде чем они будут сохранены в базе данных

Ответ №2:

Используйте класс SqlDataReader

Редактировать: Это пример кода по ссылке, теперь разница между этим примером и вашим случаем заключается в том, что вы должны указать тип вашей команды как StoredProcedure.
Если это все еще не поможет, дайте мне знать.

 private static void ReadOrderData(string connectionString)
{
    string queryString =
        "SELECT OrderID, CustomerID FROM dbo.Orders;";

    using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        SqlCommand command =
            new SqlCommand(queryString, connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Call Read before accessing data.
        while (reader.Read())
        {
            Console.WriteLine(String.Format("{0}, {1}",
                reader[0], reader[1]));
        }

        // Call Close when done reading.
        reader.Close();
    }
}
  

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

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