C # MySqlConnector 6.4.4 LAST_INSERT_ID () Как INT64? - PullRequest
2 голосов
/ 20 января 2012
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

Ответы [ 2 ]

2 голосов
/ 20 января 2012

После публикации ошибки в Connector / Net и получения отзывов я был направлен в документацию. CONVERT и CAST приводят к получению 64-битных чисел при преобразовании в целочисленный тип. Не уверен, почему они не просто делают что-то вроде CAST (1 как SMALLINT), CAST (1 AS INT), CAST (1 AS BIGINT), но они этого не делают. Так как он возвращается с сервера MySQL как LONGLONG (64-разрядный), соединитель не будет знать, что это должен быть 32-разрядный тип int.

Я все еще пытаюсь выяснить, почему LAST_INSERT_ID () возвращает LONGLONG с сервера.

0 голосов
/ 20 января 2012

Вероятно, потому что, когда возвращаемое значение не слишком велико, тогда Convert.ToInt32 () может выполнить преобразование (то есть значение будет соответствовать 32-разрядному целому числу). Однако приведение говорит компилятору, что вы думаете, что val - это 32-битное значение, а это не так.

...