Вставьте данные в таблицу и получите идентификатор из увеличенного первичного ключа - PullRequest
0 голосов
/ 16 февраля 2020

В моем приложении ASP. NET мне нужно сделать что-то вроде этого: сначала получить данные от пользователя, затем вставить эти данные в SQL таблицу базы данных сервера, затем получить значение ID из этой таблицы (которая автоинкрементна), а затем использовать ее в другой вставке в другую таблицу.

Теперь я уже выяснил, что для этого мне нужно использовать T- SQL OUTPUT пункт. Однако, когда я пытаюсь сделать это, я получаю эту ошибку:

enter image description here

Я пытался следовать советам из этих сообщений: Получить выходной параметр значение в ADO. NET и Использование SQL Вывод хранимой процедуры на сервере в asp. net c#, но я не могу заставить его работать.

Я не использую хранимую процедуру, а вместо этого единственный оператор SQL. Вот оно:

INSERT INTO BS_product_sets (User_id, Set_name, Set_id, Products_count) 
OUTPUT inserted.ID INTO @NEWID 
VALUES (@UID, @SNAME, @SPREFIX, @PCOUNT)

Я также попробовал это:

DECLARE @NEWID int; 

INSERT INTO BS_product_sets (User_id, Set_name, Set_id, Products_count) 
OUTPUT inserted.ID INTO @NEWID 
VALUES (@UID, @SNAME, @SPREFIX, @PCOUNT)

Но тогда это становится еще более странным, потому что я получаю ошибку:

enter image description here

Кто-нибудь из вас знает, как ее решить? Вот остаток моего кода в C#:

public void InsertProductAutoBinds(int user_id, int parameters_count, List<int> cat_ids, List<string> names, List<string> values, string set_name, string set_id)
{
    SqlConnection connection = new SqlConnection(DatabaseConstants.ConnectionString);

    // Adding set to database
    SqlCommand command = new SqlCommand(DatabaseConstants.InsertSet, connection);
    command.Parameters.AddWithValue("@UID", user_id);
    command.Parameters.AddWithValue("@SNAME", set_name);
    command.Parameters.AddWithValue("@SPREFIX", set_id);
    command.Parameters.AddWithValue("@PCOUNT", 0);
    command.Parameters.Add("@NEWID", SqlDbType.Int).Direction = ParameterDirection.Output;

    connection.Open();
    command.ExecuteNonQuery();

    int new_inserted_id = Convert.ToInt32(command.Parameters["@NEWID"].Value);

    connection.Close();

    // Adding binds
    command = new SqlCommand(DatabaseConstants.InsertAutoBinds1, connection);
    command.Parameters.AddWithValue("@UID", user_id);
    command.Parameters.AddWithValue("@SID", new_inserted_id);
    command.Parameters.AddWithValue("@P1ID", cat_ids[0]);
    command.Parameters.AddWithValue("@VN1", names[0]);
    command.Parameters.AddWithValue("@VS1", values[0]);

    if (parameters_count > 1)
    {
        command.CommandText = DatabaseConstants.InsertAutoBinds2;
        command.Parameters.AddWithValue("@P2ID", cat_ids[1]);
        command.Parameters.AddWithValue("@VN2", names[1]);
        command.Parameters.AddWithValue("@VS2", values[1]);
    }

    if (parameters_count > 2)
    {
        command.CommandText = DatabaseConstants.InsertAutoBinds3;
        command.Parameters.AddWithValue("@P3ID", cat_ids[2]);
        command.Parameters.AddWithValue("@VN3", names[2]);
        command.Parameters.AddWithValue("@VS3", values[2]);
    }

    connection.Open();
    command.ExecuteNonQuery();
    connection.Close();
}

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

Если вы посмотрите на официальную документацию MS для INSERT INTO, вы увидите:

OUTPUT INTO {@table_variable | output_table}

Это означает: предложение OUTPUT ... INTO .... работает только с таблицей или табличной переменной в качестве цели - вы не можете сделать OUTPUT .... INTO @variable - это просто не поддерживается.

Так что вам нужно

  • либо сделать OUTPUT ... INTO @tableVar, а затем выбрать первое значение из этой табличной переменной и вернуть его
  • просто используйте OUTPUT inserted.ID ( без any INTO ....) и просто получите значение, возвращаемое командой SQL в вашем коде C# - в данном случае, поскольку data is возвращается, вам нужно использовать .ExecuteScalar() вместо .ExecuteNonQuery() в вашем C# коде
0 голосов
/ 17 февраля 2020

Если у вас есть:

CREATE TABLE tab (Id Int IDENTITY, User_Id Int, ...)

DECLARE @NewID Int

INSERT INTO tab (User_Id,...) VALUES (123, ...)

SET @NewId = @@Identity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...