从MySQL返回不正确的Id

时间:2012-05-07 11:03:49

标签: c# mysql

我有一个看起来像这样的存储过程

BEGIN
insert into `TheSomaProject`.`Projects` 
( `ProjectNr`, `MachineName`, `MachineNameEng`, `Type_Id`, 
  `SerialNr`, `Description`, `Created`, `CompanyId`, `MachineType` ) 
values 
( param_ProjectNr, param_MachineName, param_MachineNameEng, param_TypeId, 
  param_Serial, param_Description, NOW(), param_CompId, param_MachineType); 
SELECT last_insert_id(); 
END

但是返回剂量给了我Id,它看起来像这个0x00000000。 C#代码看起来像这样

MySqlDataReader Reader;
MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "CALL stp_InsertProject(@param_ProjectNr, @param_MachineName, @param_MachineNameEng, @param_TypeId, @param_Serial, @param_Description, @param_CompId, @param_MachineType);";
cmd.Parameters.AddWithValue("@param_ProjectNr", projectNr);
cmd.Parameters.AddWithValue("@param_MachineName", MachineName);
cmd.Parameters.AddWithValue("@param_MachineNameEng", MachineNameEng);
cmd.Parameters.AddWithValue("@param_TypeId", TypeId);
cmd.Parameters.AddWithValue("@param_Serial", SerialNr);
cmd.Parameters.AddWithValue("@param_Description", Description);
cmd.Parameters.AddWithValue("@param_CompId", CompanyId);
cmd.Parameters.AddWithValue("@param_MachineType", MachineType);
conn.Open();
Reader = cmd.ExecuteReader();
while (Reader.Read())
{
    Id = Convert.ToInt32(Reader["last_insert_id()"]);
}
conn.Close();

但是如果我尝试在phpMyAdmin中使用相同的stp_InsertProject,我会得到正确的ID。

3 个答案:

答案 0 :(得分:3)

您的存储过程不会返回带有名为“last_insert_id()”的列的结果集,因此使用MySqlDataReader将无效(正如您所期望的那样)。

使用ExecuteScalar()获取结果。请注意,返回的值实际上是64-bit integer,因此应使用Int64(或long)类型来保存结果:

Int64 lastInsertId = (Int64)cmd.ExecuteReader();

如果你需要一个Int32变量,如果插入太多行会冒溢,那么请确保你没有直接转换为Int32(或int)因为这会导致InvalidCastException,因为返回类型实际上不是Int32而是Int64。在这种情况下,请使用Convert.ToInt32。但我真的建议你使用64位整数。

答案 1 :(得分:1)

Int64 i = (Int64)cmd.ExecuteScalar();

答案 2 :(得分:0)

我猜你必须使用单独的查询来获取它

//your code till the line "conn.Open();" goes here
cmd.ExecuteNonQuery();
cmd.CommadText="SELECT last_insert_id()";
Id=Convert.ToInt32(cmd.ExecuteScalar());