Member 11644373 Ответов: 2

Как мне выйти из этой ошибки


Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.


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


protected void BtnSubmit_Click(object sender, EventArgs e)
    {
        var collection = Repeater0.Items;

        foreach (RepeaterItem item in collection)
        {
            HiddenField QID = (HiddenField)item.FindControl("QID");

            int q = int.Parse(QID.Value);

            string answer = Request.Form[q.ToString()];
            string id = Convert.ToString(Session["UserID"]);
            string id2 = Convert.ToString(Session["ID"]);
          
        string connection = ConfigurationManager.AppSettings["connection"].ToString();
        SqlConnection connec = new SqlConnection(connection);
        connec.Open();
        SqlCommand cmd = new SqlCommand("Insert into t_AnswerSheet(UserId,QId, AnswerId,AnswerResult) values('" + id + "','" + q + "',(select AID from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%'),(select AnswerResult from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%'))", connec);
        cmd.ExecuteNonQuery();
        connec.Close();
       
        }

        Response.Redirect("LoginPage.aspx");

    }


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

foreach (RepeaterItem item in collection)
      {
          HiddenField QID = (HiddenField)item.FindControl("QID");

          int q = int.Parse(QID.Value);

          string answer = Request.Form[q.ToString()];
          string id = Convert.ToString(Session["UserID"]);
          string id2 = Convert.ToString(Session["ID"]);

      string connection = ConfigurationManager.AppSettings["connection"].ToString();
      SqlConnection connec = new SqlConnection(connection);
      connec.Open();
      SqlCommand cmd = new SqlCommand("Insert into t_AnswerSheet(UserId,QId, AnswerId,AnswerResult) values('" + id + "','" + q + "',(select AID from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%'),(select AnswerResult from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%'))", connec);
      cmd.ExecuteNonQuery();
      connec.Close();

      }

2 Ответов

Рейтинг:
7

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
13

F-ES Sitecore

Если вы загуглите сообщение об ошибке, то найдете множество объяснений этой проблеме.

Либо это

(select AID from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%')


или это

(select AnswerResult from t_Answers where QId='" + q + "' and AOptions like'%" + answer + "%')


они возвращают более одного результата, однако способ их использования требует, чтобы они возвращали только один результат. Мы не можем сказать вам почему, так как у нас нет ваших данных и мы не знаем ваших входных данных. Исправьте запросы так, чтобы они возвращали только один результат, или найдите лучший способ найти соответствующий идентификатор ответа и т. д.