MySqlCommand.LastInsertedId возвращает 0

Я пытаюсь выполнить хранимую процедуру и вернуть последний введенный идентификатор, но каждый раз результат равен 0.

Вот как я это делаю:

public long InsertActivity(cActivities objAct)
    {          
        long lastID = 0;

        try
        {
            MySqlCommand myCmd = connection.CreateCommand();
            connection.Open();

            myCmd.CommandText = "add_activity";
            myCmd.CommandType = CommandType.StoredProcedure;

            myCmd.Parameters.AddWithValue("@TGUID", objAct.TGUID);
            myCmd.Parameters.AddWithValue("@TItem", objAct.TItemID);
            myCmd.Parameters.AddWithValue("@ActDesc", objAct.ActivityDesc);
            myCmd.Parameters.AddWithValue("@DateStart", objAct.DateStart);
            myCmd.Parameters.AddWithValue("@DateEnd", objAct.DateEnd);
            myCmd.Parameters.AddWithValue("@ActNote", objAct.Note);
            myCmd.Parameters.AddWithValue("@Category", objAct.Category);

            if (myCmd.ExecuteNonQuery() > 0)
            {
                lastID = myCmd.LastInsertedId;

                myCmd.Parameters.Clear();

                connection.Close();

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("ERROR: " + ex.Message);
        }

        return lastID;
    }

и вот процедура add_activity

CREATE DEFINER=`root`@`localhost` PROCEDURE `add_activity`(IN `TGuid` VARCHAR(50), IN `TItem` INT, IN `ActDesc` VARCHAR(100), IN `DateStart` DATE, IN `DateEnd` DATE, IN `ActNote` VARCHAR(500), IN `Category` VARCHAR(200), OUT `_lastID` BIGINT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
INSERT INTO activities (TGUID, TItemID, Descr, DateStart, DateEnd, Note, Category) VALUES (TGuid, TItem, ActDesc, DateStart, DateEnd, ActNote, Category);

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

1 ответ

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

CREATE PROCEDURE insertAndReturn
AS
BEGIN
    INSERT INTO activities (TGUID, TItemID, Descr, DateStart, DateEnd, Note, Category) OUTPUT inserted.TGUID VALUES (TGuid, TItem, ActDesc, DateStart, DateEnd, ActNote, Category);
END
GO
Другие вопросы по тегам