gpt4 book ai didi

c# - 使用 "as"关键字的表别名是否会影响数据类型?

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:01 25 4
gpt4 key购买 nike

我使用了以下查询:

select id from foo order by id DESC limit 1

返回最后使用的id

如果不为零,我在我的应用程序中添加了一些东西。它工作正常。但我决定在 sql 而不是 C# 代码中执行此操作。但是当我这样做时:

 SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1

但是我得到了一个 System.InvalidCastException 错误,令我惊讶的是,下面代码中打印的数据类型是 int64。但是它变了吗?

这是 C# 代码:

public int GetLastID()
{
using (MySqlConnection con = Open())
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1";
cmd.Connection = con;
con.Open();

MySqlDataReader data = cmd.ExecuteReader();

if (!data.Read())
return 0;

System.Windows.Forms.MessageBox.Show(data["id"].GetType().ToString()); // output: int64
return (int)data["id"];
}
}
}

别怪我的mysql不好。我用得不多。如果您知道更好的方法,请告诉我!

最佳答案

分配给列的别名 (AS id) 不会更改数据类型。

表达式的数据类型是表达式的结果。

在 MySQL 中,整数加法运算(例如 id + 1,其中 id 是整数类型)导致 BIGINT

此行为记录在(现成的)MySQL 引用手册中:https://dev.mysql.com/doc/refman/5.6/en/arithmetic-functions.html

节选:


  • The usual arithmetic operators are available. The result is determined according to the following rules:

In the case of -, +, and *, the result is calculated with BIGINT (64-bit) precision if both operands are integers.


因此,BIGINT 数据类型(64 位整数)的返回是预期的行为。

如果您的要求是返回一个 32 位整数,唯一的解决方法(据我所知)是创建一个用户定义的函数,例如

  DELIMITER $$

CREATE FUNCTION udf_bigint_to_int(n BIGINT)
RETURNS INTEGER
BEGIN
RETURN n;
END$$

DELIMITER ;

作为这个工作的演示,也作为对行为的警告,传递的值大于 32 位整数可以支持的值,我们可以运行这个:

  SELECT udf_bigint_to_int(9876543210+9)

返回 32 位整数的最大值:

  udf_bigint_to_int(9876543210+9)
-------------------------------
2147483647

如果目的是从表中获取最大的 id 值,并将其加 1,并将其作为 32 位整数返回,则在创建用户定义函数后,您可以使用这样的查询:

 SELECT udf_bigint_to_int( MAX(id) + ABS(SIGN( MAX(id) ))) AS id FROM foo

关于c# - 使用 "as"关键字的表别名是否会影响数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com