C# MySqlConnector 6.4.4 LAST_INSERT_ID() As INT64?

本文关键字:As INT64 INSERT MySqlConnector LAST ID | 更新日期: 2023-09-27 18:20:45

SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER);

MySqlCommand.ExecuteScalar(( 和 MySqlDataReader.GetValue(int index( 都返回和object类型。我假设因为我明确地将该LAST_INSERT_ID转换为有符号整数,所以我可以使用 (int)cmd.ExecuteScalar()(int)rdr.GetValue(0) 之类的东西来拆箱该对象。

但是,我不断收到一个错误,指出强制转换无效。调试时,我注意到返回的对象类型是 INT64。因此,我可以通过使用 (long)cmd.ExecuteScalar() 强制转换值来取消对象框框。

我只是想理解为什么它以 INT64 而不是 INT32 的形式返回?

顺便说一下,我的自动增量列的数据类型是有符号整数

下面是一个测试用例:

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 IDSELECT CONVERT(1, SIGNED INTEGER) As ID 还通过连接器返回 64 位 int。尝试看看我是否可以通过在ILSpy中加载MySql.Data来弄清楚任何事情

C# MySqlConnector 6.4.4 LAST_INSERT_ID() As INT64?

在发布连接器/网络错误并获得反馈后,我被定向到文档。转换和强制转换在转换为整数类型时都会导致 64 位数字。不知道为什么他们不只是做像 CAST(1 作为 SMALLINT(、CAST(1 作为 INT(、CAST(1 作为 BIGINT(这样的事情,但他们没有。由于它从 MySQL 服务器返回为 LONGLONG(64 位(,因此连接器不知道它应该是 32 位 int。

我仍在试图弄清楚为什么 LAST_INSERT_ID(( 从服务器返回 LONGLONG。

可能是因为当返回的值不是太大时,Convert.ToInt32(( 可以进行转换(即该值将适合 32 位整数(。强制转换虽然告诉编译器你认为 val 是一个 32 位值,但事实并非如此。