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。通过在ILSpy
答案 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位的值,但它不是。