gpt4 book ai didi

c# - 来自 SqlDataReader 的转换问题

转载 作者:太空狗 更新时间:2023-10-30 00:17:06 25 4
gpt4 key购买 nike

假设我有这个 sql 语句并且我执行了一个 sql 命令来获取数据读取器:

"select 1 union select 2"
//.....
var rdr = cmd.ExecuteReader();

现在我想读取第一行第一列中的值:

var myInt = (int)rdr.GetValue(0); //great this works
var myLong = (long)rdr.GetValue(0); //throws cast exception, even though you can cast int to long

因此,您在 C# 中转换为的类型似乎需要与 SQL 类型完全匹配。 IE。如果sql类型是bigint,只能转成long。如果sql类型是int,则只能强制转换为int。没有混搭……

无论 c# 请求和 sql 返回的整数类型如何,只要您理论上可以将一个转换为另一个,我只想得到一些有用的东西。因此,如果 SQL Server 给我一个浮点类型,而我要求一个 int,我想要你从执行转换中得到的截断的 int。

我的目标是使它与泛型一起工作,因此当泛型参数与 sql server 中的数据类型不完全匹配时,我可以让这个函数工作:

List<T> GetFirstColumn<T>(string sql) where T : struct
{
//get connection, execute reader
// loop:
// lst.Add( (T) rdr.GetValue(0));
}

我希望这对两个语句都适用:

var sql1 = "Select 1"; //sql int
var sql2 = "Select cast(1 as bigint)"; //sql equivalent of a long
var lst1 = GetFirstColumn<int>(sql1);
var lst2 = GetFirstColumn<int>(sql2);

有没有人有相对轻松的方法来做到这一点?

最佳答案

正如 Fredrik 所说,来自 SqlDataReader 的值是装箱的。您可以使用 Convert.ToInt32 将装箱值转换为 int,例如:

int i = Convert.ToInt32(read[0]);

即使 SQL Server 返回 bigint 或 decimal,这也会尝试转换。

关于c# - 来自 SqlDataReader 的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639925/

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