1

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

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。

4

3 回答 3

3

您的存储过程不会返回包含名为“last_insert_id()”的列的结果集,因此使用 anMySqlDataReader将不起作用(如您所料)。

用于ExecuteScalar()获取结果。请注意,返回的值实际上是一个64 位整数,因此应该使用Int64(or long) 类型来保存结果:

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

如果您需要一个Int32变量,并且如果插入太多行则有溢出的风险,请确保您不要直接转换为Int32(or int),因为这将导致 an ,InvalidCastException因为返回类型实际上不是Int32but Int64。在这种情况下使用Convert.ToInt32. 但我真的建议您使用 64 位整数。

于 2012-05-07T11:22:24.747 回答
1

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

于 2012-05-07T11:16:49.640 回答
0

我想你必须用单独的查询来代替

//your code till the line "conn.Open();" goes here
cmd.ExecuteNonQuery();
cmd.CommadText="SELECT last_insert_id()";
Id=Convert.ToInt32(cmd.ExecuteScalar());
于 2012-05-07T11:15:47.050 回答