Как создать поиск, используя трехуровневую архитектуру

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

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

CREATE PROCEDURE [dbo].[GuestSearch]
    @FirstName varchar(20),
    @LastName varchar(20),
    @Phone varchar(15)
AS
    SELECT FirstName, Lastname, Phone
    FROM Guest
    WHERE FirstName LIKE '%'+@FirstName+'%'
    AND LastName LIKE '%'+@LastName+'%' AND
    Phone LIKE '%'+@Phone+'%'

БЕЛ

public class GuestBEL
    {
        public int GuestID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
    }

БЛЛ

public DataSet FindGuest()
        {
            GuestDAL objDAL = new GuestDAL();
            return objDAL.FindGuest();
        }

ДАЛ

public DataSet FindGuest()
        {
            DataSet dts = new DataSet();
            SqlCommand cmd = new SqlCommand("GuestSearch", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter adapt = new SqlDataAdapter(cmd);
            con.Open();
            adapt.Fill(dts);
            cmd.Dispose();
            dts.Dispose();
            con.Close();
            return dts;
        }

UI

protected void btnSearch_Click(object sender, EventArgs e)
        {
            DataSet data = new DataSet();
            data = objBLL.FindGuest();
            gvGuest.DataSource = data;
            gvGuest.DataBind();
            readGrid();
        }

Итак, когда я набираю что-то в поиске, gridview должен отображать то, что я ввел в текстовое поле, но по какой-то причине я получаю сообщение об ошибке: «Процедура или функция «GuestSearch» ожидает параметр «@FirstName», который не был предоставлен.


person Jed    schedule 02.05.2019    source источник
comment
вам нужно добавить параметры к вашему SqlCommand.   -  person Daniel A. White    schedule 02.05.2019


Ответы (1)


Вам нужно добавить параметры в функцию Command в public DataSet FindGuest():

cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = "somename";
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = "somelastname";
cmd.Parameters.Add("@Phone", SqlDbType.VarChar).Value = "somephone";
person Chakian    schedule 02.05.2019
comment
Или вы можете сделать параметры хранимой процедуры необязательными: @FirstName varchar(20) = '' и так далее. - person Chakian; 02.05.2019
comment
Итак, я попробовал этот метод, но я получаю возврат этой ошибки в своем пользовательском интерфейсе DataBinding: «System.Data.DataRowView» не содержит свойства с именем «GuestID». - person Jed; 02.05.2019
comment
Похоже, что ваша сетка gvGuest ожидает поля GuestID, но в источнике данных его нет. Можете ли вы добавить GuestID к оператору выбора хранимой процедуры: SELECT GuestID, FirstName, Lastname, Phone - person Chakian; 03.05.2019
comment
Обычно это происходит, если столбец отсутствует, как указано в этот вопрос. Можете ли вы показать нам свою реализацию GridView? - person Chakian; 14.05.2019