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