Member 14743579 Ответов: 2

Пытаюсь сделать код в 3 слоя для автоматического заполнения данных.


Это мой одностраничный код.
использование этого кода заключается в автоматическом заполнении данных в txtboxpartyid.text, когда я ввел данные в поле txtboxprod_id.text.


sqlconnection con = новый sqlconnection();
sqlcommand cmd = новая команда sqlcommand();

нажмите на кнопку();
{
кон.открыть();
cmd= new sqlcommand("select * from product where prod_id='"+txtboxprod_id.text+"'",con);
класс sqldatareader СДР= ЦМД.метода executereader();
если(СДР.читать())
{
txtboxpartyid.текст=(СДР["party_id"].метод toString());
}
кон.рядом();
}

Что я уже пробовал:

я пытаюсь преобразовать этот одностраничный код в 3-слойную архитектуру, но мой код не работает, и это также дает мне ошибку на части sqldatareader. ошибка заключается в том, что ваше соединение закрыто. пожалуйста, помогите мне преобразовать этот одностраничный код в 3 слоя и заранее спасибо...
приведенный ниже код является только основной частью кода без отображения кода sqlconnection или sqldataadapter.
SQl command to create a procedure:
go
create procedure spsearchpartyid(@prod_id int)
as 
begin
select * from product where Prod_id=@prod_id;
end

>BELayer page code:
public string quantity { get; set; }
public string prod_id { get; set; }
public string party_id { get; set; }




DALayer page code
//command for auto fill data into quantity table;
        public SqlDataReader autofillparty_id(BEL beobj)
        {
            try
            {
                
                cmd = new SqlCommand("select * from product where prod_id='" + beobj.prod_id + "'", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "spsearchpartyid";
                cmd.Parameters.AddWithValue("@prod_id", beobj.prod_id);
                con.Open();
                SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return sdr;
     
            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally 
            {
               con.Close();
            }
        }



BALayer page code.
//command for autofill data into table quantity..
        public SqlDataReader autofillquantity(BEL beobj)
        {
            try
            {
                return daobj.autofillparty_id(beobj);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

<pre lang="c#"><pre lang="c#">
Код главной страницы.
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
если (baobj.autofillquantity(beobj).Читать())
{
txtboxpartyidquant.Текст = (beobj.party_id.Метод toString());

}

}

2 Ответов

Рейтинг:
0

OriginalGriff

Когда вы задали этот вопрос вчера: Как я могу разделить эту одностраничную команду в 3-слойной архитектуре на ASP.NET с#..[^]
Я же сказал тебе не беспокоиться об этом так как у тебя были гораздо более серьезные проблемы:

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

Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И если вы не собираетесь слушать нас, когда мы даем вам советы, Есть ли смысл вообще спрашивать?


Member 14743579

у вас есть решение по этому поводу, чем, пожалуйста, дайте немедленно, это срочно..

OriginalGriff

Это далеко не так срочно, как сохранение вашей базы данных.

Member 14743579

я думаю, что у вас нет ответа на этот вопрос.
если у вас есть, чем, пожалуйста, решить мою проблему..

OriginalGriff

Если вы не собираетесь слушать то, что мы говорим, тогда нет смысла нам что-либо говорить.

Пока.

Member 14743579

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

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

phil.o

Проблема заключается в построении SQL-запросов путем объединения строк. Вы должны никогда сделать это. Пол уже объяснил почему.

Dave Kreskowiak

Ты понятия не имеешь, о чем говоришь.

Это не хранимая процедура, и вы даже не вызываете ее:

SqlCommand("select * from product where prod_id='" + beobj.prod_id + "'", con)


Ваш код вообще не будет работать, потому что в самой следующей строке вы сказали объекту команды, что вызываете хранимую процедуру:
cmd.CommandType = CommandType.StoredProcedure;

Вы не вызываете хранимую процедуру в тексте команды.

Этот код немедленно выйдет из строя.

Рейтинг:
0

Member 14743997

Вы не можете прочитать SqlDataReader для закрытого соединения. Так что ты должен отодвинуть кона.Метод Close() из кода страницы DALayer в событие button1_Click.

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
пробовать
{
если (baobj.autofillquantity(beobj).Читать())
{
txtboxpartyidquant.Текст = (beobj.party_id.Метод toString());
}
}
наконец
{
против.Закрывать();
}
}