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()」という名前の列を含む結果セットを返さないため、MySqlDataReader(予想どおり) を使用しても機能しません。

結果を取得するために使用ExecuteScalar()します。返される値は実際には64 ビット整数であるため、Int64(またはlong) 型を使用して結果を保持する必要があることに注意してください。

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

変数が必要であり、Int32挿入される行が多すぎるとオーバーフローのリスクがある場合は、Int32(or int)に直接キャストしないようにしてください。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 に答える