SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER);
MySqlCommand.ExecuteScalar () и MySqlDataReader.GetValue (int index) оба возвращают и object
типа. Я предположил, потому что явно преобразовал этот LAST_INSERT_ID в SIGNED INTEGER, чтобы я мог распаковать этот объект, используя что-то вроде (int)cmd.ExecuteScalar()
или (int)rdr.GetValue(0)
.
Однако я продолжаю получать сообщение о том, что приведение неверно. Во время отладки я заметил, что тип возвращаемого объекта - INT64. Таким образом, я могу распаковать объект, приведя значение с помощью (long)cmd.ExecuteScalar()
.
Я просто пытаюсь понять, почему он возвращается как INT64 вместо INT32?
Кстати, мой тип данных для автоинкрементного столбца - SIGNED INTEGER .
Вот тестовый пример:
using (MySqlConnection con = new MySqlConnection(ConfigurationManager.ConnectionStrings["skimmel"].ConnectionString))
{
using (MySqlCommand cmd = new MySqlCommand(@"INSERT INTO test (Name) VALUES (@Name); SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER);", con))
{
var p = new MySqlParameter("@Name", MySqlDbType.String);
p.Value = "Test" + DateTime.Now.Ticks.ToString();
cmd.Parameters.Add(p);
con.Open();
object val = cmd.ExecuteScalar();
Type t = val.GetType();
long l = (long)val;
int i1 = Convert.ToInt32(val);
int i2 = (int)val; // <-- Error here!
}
}
Провели ли некоторые дополнительные проверки и обнаружили, что проблема не связана с LAST_INSERT_ID. SELECT 1 AS ID
и SELECT CONVERT(1, SIGNED INTEGER) As ID
также возвращают 64-битное int через соединитель. Попробую посмотреть, смогу ли я что-нибудь выяснить, загрузив MySql.Data в ILSpy