我有一个看起来像这样的存储过程
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。
答案 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());