C#MySqlConnector 6.4.4 LAST_INSERT_ID()如同INT64?

时间:2012-01-19 22:29:36

标签: 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来试图查看是否可以解决任何问题

2 个答案:

答案 0 :(得分:2)

发布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的原因。

答案 1 :(得分:0)

可能是因为当返回的值不是太大时,Convert.ToInt32()可以进行转换(即该值将适合32位整数)。演员虽然告诉编译器你认为val是一个32位的值,但它不是。