Member 13771716 Ответов: 1

'Подзапрос вернул более 1 значения. Это не допускается " ошибка


В настоящее время я получаю этот код ошибки при попытке выполнить запрос вставки в C#

System.Data.SqlClient.SqlException: 'подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за=, !=, <, <= , >, >= или когда подзапрос используется в качестве выражения.
Заявление было прекращено".

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

Вот мой код C# с момента нажатия кнопки отправки значений:

protected void btnSubmit_Click(object sender, EventArgs e)
        {
        string query = "insert into Stock_Take(Username, StockDate) OUTPUT INSERTED.StockTakeIDNew values(@Username, GetDate()); Insert into Stock_Take_Item(ItemID, BarQuantity, StorageQuantity, StockTakeIDNew) values(@ID, @BAR, @STORAGE, (Select StockTakeIDNew from Stock_Take))";
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand(query, con);
        con.Open();

        foreach (GridViewRow row in gvStockTake.Rows)
        {
            Label ID = row.FindControl("itemId") as Label;
            TextBox BAR = row.FindControl("txtBar") as TextBox;
            TextBox STORAGE = row.FindControl("txtStorage") as TextBox;
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
            cmd.Parameters.Add("@BAR", SqlDbType.Int).Value = BAR.Text;
            cmd.Parameters.Add("@STORAGE", SqlDbType.Int).Value = STORAGE.Text;

        }
        cmd.Parameters.AddWithValue("@Username", Session["username"]);
        cmd.ExecuteNonQuery(); //query execution
        con.Close();
        Response.Write("Successfully inserted stock take items.");
    }


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

Я думаю, что, возможно, мне следует разделить запрос на две части и иметь query1 для второй половины инструкции SQL. Поэтому сначала выполните первую половину запроса, а затем вторую половину, как только я добавлю параметры в раздел "foreach"?

Я все еще новичок в C# и SQL, так что любые рекомендации будут полностью оценены!!

1 Ответов

Рейтинг:
1

OriginalGriff

Прочтите, что я ответил на ваш последний вопрос: Как я могу сделать значение первичного ключа таким же, как внешний ключ в другой таблице?[^] - он говорит вам, что делать.
Вместо того чтобы возиться с выводом, используйте SCOPE_IDENTITY, чтобы получить значение внешнего ключа:

INSERT INTO Stock_Take (Username, StockDate) VALUES (@Username, GetDate()); DECLARE @STID INT; SET @STID = SCOPE_IDENTITY(); INSERT INTO Stock_Take_Item(ItemID, BarQuantity, StorageQuantity, StockTakeIDNew) values(@ID, @BAR, @STORAGE, @STID)