Использование значения с ограниченной областью в операторах insert?

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

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

Вопрос:

Примечание: Я создаю практический проект, в котором мой тренер запретил мне параметризировать. Я осведомлен о рисках безопасности, но сайт не будет развернут. Я использую метод select scope_identity для извлечения автоматически увеличиваемого значения из столбца SubmissionId в моей таблице представлений.

Я хочу вставить это значение в две другие таблицы; У меня есть newSubID, объявленный как var, и я использую его в операторах insert, но я получаю сообщение об ошибке

Имя «newSubID» в этом контексте недопустимо. Допустимыми выражениями являются константы, постоянные выражения и (в некоторых контекстах) переменные. Имена столбцов не разрешены.

Чего мне здесь не хватает?

Вот мой код:

 protected void BtnSubmit_Click(object sender, EventArgs e)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    String subQuery = "INSERT INTO Submission (Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments) VALUES ('"   TbCoverage.Text   "','"   TbCurrentCoverage.Text   "','"   TbPrimEx.Text   "','"   TbRetention.Text   "','"   TbEffectiveDate.Text   "','"   TbCommission.Text   "','"   TbPremium.Text   "','"   TbComments.Text   "')"
          "SELECT CAST (SCOPE_IDENTITY() AS int)";

    using (SqlConnection sqlConn = new SqlConnection(connectionString))
    {
        sqlConn.Open();
        SqlCommand subCmd = new SqlCommand(subQuery, sqlConn);

        using (subCmd)
        {
            subCmd.ExecuteNonQuery();
            var newSubID = (Int32)subCmd.ExecuteScalar();

            String custQuery = "INSERT INTO Customer (CustId, CustName, SicNaic, CustAdd, CustCity, CustState, CustZip, SubId) VALUES ('"   TbCustId.Text   "', '"   TbCustName.Text   "', '"   RblSicNaic.SelectedItem   "', '"   TbCustAddress.Text   "', '"   TbCustCity.Text   "', '"   DdlCustState.SelectedItem   "', '"   TbCustZip.Text   "', newSubID)";
            String broQuery = "INSERT INTO Broker (BroId, BroName, BroAdd, BroCity, BroState, BroZip, EntityType, SubId) VALUES ('"   TbBroId.Text   "', '"   TbBroName.Text   "', '"   TbBroAddress.Text   "', '"   TbBroCity.Text   "', '"   DdlBroState.SelectedItem   "', '"   TbBroZip.Text   "', '"   DdlEntity.SelectedItem   "', newSubID)";
            SqlCommand custCmd = new SqlCommand(custQuery, sqlConn);
            SqlCommand broCmd = new SqlCommand(broQuery, sqlConn);
            using (custCmd)
            using (broCmd)
            {
                custCmd.ExecuteNonQuery();
                broCmd.ExecuteNonQuery();
                Response.Redirect("~/View.aspx?ProductId="   newSubID);
            }
  

Это вызывается на следующей странице следующим образом (я оставил ошибки, поскольку они в интересах помочь тому, кому может понадобиться увидеть проблему и решения, которые перечислены в ответах ниже):

 string x = Request.QueryString["SubmissionId"];
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
string editCustQuery = "SELECT CustName, SicNaic, CustCity, CustAdd, CustState, CustZip FROM Customer WHERE SubId ="   x;
using (SqlConnection editConn = new SqlConnection(connectionString))
{
    editConn.Open();

    using (SqlCommand CustCommand = new SqlCommand(editCustQuery, editConn))
    {
        SqlDataReader dr = CustCommand.ExecuteReader();
        dr.Read();
        LblCustName.Text = dr.GetString(0);
        LblSicNaic.Text = dr.GetString(1);
        LblCustCity.Text = dr.GetString(2);
        LblCustAddress.Text = dr.GetString(3);
        LblCustState.Text = dr.GetString(4);
        LblCustZip.Text = dr.GetInt32(5).ToString();
    }
  

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

1. @ibram, не будет ли выход за пределы области видимости (я думаю, это правильный термин для закрытия этого блока кода с фигурной скобкой) автоматически закрывать программу чтения?

2. вы должны быть в шлеме. Этого не произойдет.

Ответ №1:

Это потому, что вы не объединяете newSubID в инструкции custQuery / btoQuery SQL, а вместо этого используете буквальный текст «newSubID» в инструкции, которая здесь недопустима, поскольку предполагается, что «newSubID» — это имя столбца.

т. е.

 String custQuery = "INSERT INTO Customer (CustId, CustName, SicNaic, CustAdd, CustCity,
    CustState, CustZip, SubId) 
VALUES ('"   TbCustId.Text   "', '"   TbCustName.Text   "', '"   RblSicNaic.SelectedItem     
    "', '"   TbCustAddress.Text   "', '"   TbCustCity.Text   "', '"   
    DdlCustState.SelectedItem   "', '"   TbCustZip.Text   "',"   
    newSubID.toString()   ")";
  

Конечно, я даю ответ, который использует динамический SQL, подобный этому, только из-за вашего заявления об отказе от ответственности, и это не то, что я бы сделал в реальной жизни!

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

1. Конечно. Большое спасибо, @Ada. Если вы не возражаете против дополнительного вопроса, вам подходит моя строка перенаправления или мне нужно ее также объединить? Я выдаю ошибку на странице перенаправления.

2. @Brazos — Ответ. Перенаправление («~/View.aspx? ProductID =» newSubID.toString()) — если View.aspx выдает ошибки при загрузке, тогда у вас ошибка на этой странице, которую я не могу определить, не видя этого

3. Я думал, что это может быть так. Я использую эту строку x = Request. Строка запроса[«SubmissionId»]; строка ConnectionString = System. Конфигурация. ConfigurationManager. ConnectionStrings[«MyConnectionString»]. ConnectionString; string editCustQuery = «ВЫБЕРИТЕ custName, SicNaic, CustCity, CustAdd, CustState, CustZip У клиента, ГДЕ SubID =» x;», чтобы вызвать нужную строку, а затем средство чтения данных для отображения. Я почти уверен, что средство чтения данных в порядке. Есть ли еще одна вопиюще очевидная проблема с моим запросом request?

4. @Brazos — предполагая, что SubID является целым числом в базе данных, это выглядит нормально, предполагая, что переменная x действительно содержит значение (т. Е. Запрос. Строка запроса[«SubmissionId»] действительно дает вам значение).

5. @Ada, да, SubID — это значение INT в базе данных. еще один глупый вопрос, но как мне определить, содержит ли x значение? SubID автоматически увеличивается в таблице отправки, поэтому я ничего не вставлял в этот столбец в команде insert. Сообщение об ошибке, которое я получаю, является «неправильным синтаксисом рядом с ‘=’ в SqlDataReader dr = CustCommand. ExecuteReader(); строка.

Ответ №2:

  1. Ответ AdaTheDev правильный.
  2. Я думаю, у вас есть еще одна проблема. Если вы выполните ExecuteNonQuery, а затем ExecuteScalar с помощью одной и той же команды, вы будете вставлять дважды. Используйте out-параметр для вашего scope_id и вызывайте только exenonquery или вызывайте только exescalar.

             //subCmd.ExecuteNonQuery();
            var newSubID = (Int32)subCmd.ExecuteScalar();
      

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

1. Спасибо, @ibram. Возможно, это глупый вопрос, но если я удалю exenonquery, буду ли я по-прежнему вставлять все остальные значения в команду или просто вызывать значение с помощью execscalar?

2. Весь ваш sql-код будет выполнен, если он будет в одной последовательности, как у вас.