SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER);
MySqlCommand.ExecuteScalar()和MySqlDataReader.GetValue(INT指數)都返回並object
類型。我假定,因爲我明確地將該LAST_INSERT_ID轉換爲SIGNED INTEGER,我可以使用類似(int)cmd.ExecuteScalar()
或(int)rdr.GetValue(0)
的方式取消裝箱。C#MySqlConnector 6.4.4 LAST_INSERT_ID()作爲INT64?
但是,我不斷收到一個錯誤,指出演員表無效。在調試時,我注意到返回的對象的類型是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。去嘗試看看我能否通過加載MySql.Data來計算出任何數據ILSpy
什麼大小是生成此ID的基礎密鑰字段?如果實際的關鍵字段是64位,則last_insert_id()無法返回32位整型,而不截斷/破壞關鍵字。 –
數據類型是一個有符號整數(不爲NULL) – Sam