C# MySqlConnector 6.4.4 LAST_INSERT_ID() 作为 INT64?

标签 c# asp.net mysql mysql-connector

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 IDSELECT CONVERT(1, SIGNED INTEGER) As ID 也通过连接器返回 64 位 int。将尝试通过在 ILSpy 中加载 MySql.Data 来查看是否可以解决任何问题

最佳答案

在发布连接器/网络错误并获得反馈后,我被定向到文档。转换为整数类型时,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?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8934338/

相关文章:

c# - 如何将 ASP TextBox 的文本绑定(bind)到它的工具提示?

c# - 安装 ClickOnce 应用程序时出现问题

asp.net - 处理 MVC 中的创建和修改日期

c# - Fluent NHibernate - 集合不过滤

c# - 如何使用 Asp.Net 连接到 Oracle 11g 数据库

php - 解析 XML 太慢?

php - 如何将 mysql 结果链接到同一页面以显示更多详细信息

mysql - 编写带时间戳的 SQL

c# - 在 VS 上用 C# 读写希伯来语字符串

c# - 你如何在 Selenium 中设置 ChromeDriver 的端口?