Получить несколько значений из базы данных ASP.NET/C#

#c# #asp.net #sql-server #stored-procedures #webforms

#c# #asp.net #sql-сервер #хранимые процедуры #веб-формы

Вопрос:

Я пытаюсь получить / вернуть несколько значений из базы данных SQL-сервера, используя и отображая их на ASP.NET страница.

Я использую хранимую процедуру для выполнения команды SELECT на стороне базы данных.

Я могу вернуть первое значение, которое соответствует переменной @PERSON, но каждый раз возвращается только одна строка.

Любая помощь была бы высоко оценена.

Класс обработчика базы данных

 public MainSQL()
{
       _productConn = new SqlConnection();
       _productConnectionString  = "data source=mssql.database.co.uk;InitialCatalog=test_data;User ID=username;Password=password";
       _productConn.ConnectionString = _productConnectionString;
}
public string GetItemName(int PersonID)
{
     string returnvalue = string.Empty;
     SqlCommand myCommand = new SqlCommand("GetItem", _productConn);
     myCommand.CommandType = CommandType.StoredProcedure;
     myCommand.Parameters.Add(new SqlParameter("@PERSON", SqlDbType.Int));
     myCommand.Parameters[0].Value = PersonID;
     _productConn.Open();
     returnvalue = (string)myCommand.ExecuteScalar();             
     _productConn.Close();
     return (string)returnvalue;
 }
  

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

 USE [test_data]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [ppir].[GetItem]    
    (
    @PERSON int
    )   
AS
    /*SET NOCOUNT ON;*/
    SELECT Description FROM [Items] WHERE PersonID = @PERSON
    RETURN
  

return.aspx

 namespace test
{
    public partial class Final_Page : System.Web.UI.Page
    {
        MainSQL GetInfo;

        protected void Page_Load(object sender, EventArgs e)
        {
            int PersonId = (int)Session["PersonID"];
            GetInfo = new MainSQL();
            string itemname = GetInfo.GetItemName(PersonId);
            ReturnItemName.Text = itemname;

        } // End Page_Load

    } // End Class 

} // End Namespace
  

Ответ №1:

вместо этого вам следует использовать sql datareader.:

ExecuteScalar возвращает вам только первый результат, в то время как reader возвращает вам каждый результат по циклу, пока reader.Read()==false.

например :

  DataReader data_reader= MySqlCommand.ExecuteReader( ); 
   while(data_reader.Read())  
  {
       ...
  }         
  

Ответ №2:

Я изменяю ваш метод GetItem следующим образом :

 public List<string> GetItemName(int PersonID)
{
   List<string> returnvalues = new List<string>();
   SqlCommand myCommand = new SqlCommand("GetItem", _productConn);
   myCommand.CommandType = CommandType.StoredProcedure;
   myCommand.Parameters.Add(new SqlParameter("@PERSON", SqlDbType.Int));
   myCommand.Parameters[0].Value = PersonID;

   _productConn.Open();
   DataReader dr = myCommand.ExecuteReader(); 
   While(dr.Read() )  
   {
       returnvalues.Add(dr[0].ToString()); 
   }         

   _productConn.Close();
   return returnvalues;
 }
  

Ответ №3:

Ваша хранимая процедура возвращает одну строку для идентификатора или несколько строк? В конечном итоге вам нужно будет выполнить цикл по вашим результатам. Если хранимая процедура возвращает одну запись за вызов, то вам нужно выполнить цикл по идентификаторам на странице aspx. Если хранимая процедура возвращает несколько строк, то вы можете использовать и SqlDataReader вместо вызова ExecuteScalar. Перебираем возвращенные строки и добавляем их в какую-то коллекцию или список. Затем верните его на свою страницу. Однако вам все равно придется модифицировать вашу aspx-страницу для обработки коллекции.

Ответ №4:

Вы могли бы использовать SqlDataReader или SqlDataAdapter для заполнения DataSet , хотя для веб-форм вам было бы лучше полностью отделить доступ к данным от вашей страницы с помощью ObjectDataSource.