Строка запроса для вызова данных строки из SCOPE_IDENTITY

#c# #asp.net #sql-server #visual-studio

#c# #asp.net #sql-сервер #visual-studio

Вопрос:

У меня есть страница отправки для пользователей для ввода данных. Затем я перенаправляю на страницу просмотра, чтобы они могли просмотреть свои входные данные. Сеансы не выполняются, поскольку это был бы сайт большого объема, но я использовал метод идентификации области в конце моей команды отправки. Как мне запросить значение идентификатора области, чтобы данные строки отображались на моей странице просмотра?

Код приведен ниже: это учебный проект, и мне было категорически запрещено параметризовать в интересах простоты. Но да, я знаю, что параметризация — это правильный путь.

 protected void Button1_Click(object sender, EventArgs e)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    String thisQuery = "INSERT INTO ProductInstance (CustId, CustName, SicNaic, CustAdd, CustCity, CustState, CustZip, BroId, BroName, BroAdd, BroCity, BroState, BroZip, EntityType, Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments) VALUES ('"   TextBox19.Text   "', '"   TextBox1.Text   "', '"   RadioButtonList1.SelectedItem   "', '"   TextBox2.Text   "', '"   TextBox3.Text   "', '"   DropDownList1.SelectedItem   "', '"   TextBox4.Text   "', '"   TextBox18.Text   "', '"   TextBox5.Text   "', '"   TextBox6.Text   "', '"   TextBox7.Text   "', '"   DropDownList2.SelectedItem   "', '"   TextBox8.Text   "', '"   DropDownList3.SelectedItem   "','"   TextBox9.Text   "','"   TextBox10.Text   "','"   TextBox11.Text   "','"   TextBox12.Text   "','"   TextBox20.Text   "','"   TextBox14.Text   "','"   TextBox15.Text   "','"   TextBox16.Text   "'); SELECT SCOPE_IDENTITY() AS [lastInsertedProductId]";

    using (SqlConnection sqlConn = new SqlConnection(connectionString))
    {
        sqlConn.Open();

        using (SqlCommand command = new SqlCommand(thisQuery, sqlConn))
        {
            int lastInsertedProductId = Convert.ToInt32(command.ExecuteScalar());
        }
    }
    Response.Redirect("~/View.aspx");
  

и затем здесь находится код страницы просмотра:

 protected void Page_Load(object sender, EventArgs e)
{
    string x = Request.QueryString["ProductId"];
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    string editQuery = "SELECT CustId, CustName, SicNaic, CustCity, CustAdd, CustState, CustZip, BroName, BroId, BroAdd, BroCity, BroState, BroZip, EntityType, Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments FROM ProductInstance WHERE ProductId ="   x;

    using (SqlConnection editConn = new SqlConnection(connectionString))
    {
        editConn.Open();

        using (SqlCommand command = new SqlCommand(editQuery, editConn))
        {
            SqlDataReader dr = command.ExecuteReader();
            dr.Read();
            Label6.Text = dr.GetInt32(0).ToString();
  

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

1. Остановите все и прочитайте это сейчас: en.wikipedia.org/wiki/SQL_injection#Parameterized_statements

2. Хахаха да, да, я прочитал статью, и на нее ссылались или что-то подобное практически по всем моим вопросам. Сайт не предназначен для фактического развертывания, и, как я упоминал в своем вопросе, мой тренер явно запрещает мне параметризировать , потому что он хочет, чтобы я сосредоточился на понимании основ, пока все еще выполняю этот проект. Тем не менее, я действительно ценю, как все спешат указать на это. Это показывает реальную доброжелательность.

3. Вам следует рассмотреть возможность использования ORM, такого как EF или NHibernate.

4. У меня возникли проблемы с пониманием «запрещено параметризовать в интересах простоты» и «это был бы сайт большого объема». Если ваш тренер действительно пытается дать хороший совет, но игнорируются базовые безопасность и производительность, а также смешиваются проблемы докладчика и доступа к данным, то, боюсь, вам придется набираться знаний в другом месте. Если есть реальная причина использовать конкатенацию строк, то вы ДОЛЖНЫ, по крайней мере, определить строки пользовательского ввода

Ответ №1:

Попробуйте переместиться lastInsertedProductId вверх по области видимости и

 Response.Redirect("~/View.aspx?ProductId"   lastInsertedProductId );
  

Но серьезно, посмотрите на параметризованные операторы и http://bobby-tables.com /

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

1. Ха-ха, мне действительно нравятся таблицы bobby. Это был первый раз, когда я услышал о sql-инъекции, о которой я много читал. Разве мне не нужны кавычки вокруг lastInsertProductId? VS проверяет орфографию и сообщает мне, что я не могу преобразовать int в строку, а в строке перенаправления сообщает мне, что она не существует в текущем контексте.

2. Попробуйте переместить объявление lastInsertedProductId перед вашей using инструкцией.

Ответ №2:

Вы бы создали хранимую процедуру, которая выполняет всю работу, и там вы получили бы SCOPE_IDENTITY.

Сразу после вашей вставки.