C# MySqlConnector 6.4.4 LAST_INSERT_ID() 作为 INT64?

Posted

技术标签:

【中文标题】C# MySqlConnector 6.4.4 LAST_INSERT_ID() 作为 INT64?【英文标题】:C# MySqlConnector 6.4.4 LAST_INSERT_ID() As INT64? 【发布时间】:2012-02-14 14:25:32 【问题描述】:
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 的形式返回?

顺便说一下,我的 autoincrement 列的数据类型是 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 IDSELECT CONVERT(1, SIGNED INTEGER) As ID 也通过连接器返回一个 64 位 int。将尝试通过在ILSpy 中加载 MySql.Data 来查看是否可以解决任何问题

【问题讨论】:

生成此 id 的基础键字段的大小是多少?如果实际的键域是 64 位而不截断/损坏键,则 last_insert_id() 无法返回 32 位 int。 数据类型是有符号整数(非空) 【参考方案1】:

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

【讨论】:

我的数据库类型是 SIGNED INT,应该是 Int32。我在 SQL 中显式转换为 SIGNED INT。我知道 ExecuteScalar 给了我一个 BIGINT (Int64)。我想弄清楚的是为什么 MySqlConnector 继续给我 val 作为 64 位值而不是 32 位值。 是的,我明白你的意思——这很奇怪。如果在返回之前没有明确地转换它,会发生什么?【参考方案2】:

在发布了一个 Connector/Net 错误并获得反馈后,我被引导至文档。转换为整数类型时,CONVERT 和 CAST 都会产生 64 位数字。不知道为什么他们不只做 CAST(1 As SMALLINT)、CAST(1 AS INT)、CAST(1 AS BIGINT) 之类的事情,但他们没有。由于它作为 LONGLONG(64 位)从 MySQL 服务器返回,连接器不会知道它应该是 32 位 int。

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

【讨论】:

以上是关于C# MySqlConnector 6.4.4 LAST_INSERT_ID() 作为 INT64?的主要内容,如果未能解决你的问题,请参考以下文章

MySQLConnector DLL 错误 System.Threading.Tasks.Extensions 链接

MySqlConnector连接选项

C#连接MySQL数据库

连接状态 MySql Connector/NET

C# MySql 连接器/网络问题

Kafka Connect 未能添加 MySqlConnector