【发布时间】: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 ID 和 SELECT CONVERT(1, SIGNED INTEGER) As ID 也通过连接器返回一个 64 位 int。将尝试通过在ILSpy 中加载 MySql.Data 来查看是否可以解决任何问题
【问题讨论】:
-
生成此 id 的基础键字段的大小是多少?如果实际的键域是 64 位而不截断/损坏键,则 last_insert_id() 无法返回 32 位 int。
-
数据类型是有符号整数(非空)
标签: c# asp.net mysql mysql-connector