如何将SQL的bigint转换为C#对应类型

3

我正在尝试将SQL Server中的bigint转换为C#中的等效类型,但Visual Studio一直强制我尝试将其转换为int,这会引发“指定的转换无效”错误。我已经尝试将其转换为long、Int64、int等类型。正确的做法是什么?我的代码如下:

var id = 0;

//Omitted code

if (reader.Read())
{
    id = (int) reader["id"];
}

//More code

id = Convert.ToInt64(reader["id"]); 可能吗? - undefined
尝试使用reader["id"].GetType()来查看您需要进行强制转换的实际类型。 - undefined
SQL Server的bigint是一个64位整数,相当于C#中的long。我们能看到您的SQL查询和表/数据库定义吗?您可能得到了一个错误的字段。 - undefined
顺便问一下,当你尝试将类型转换为long时会发生什么?你会得到运行时错误还是编译时错误? - undefined
当我尝试将其转换为长整型时,resharper提醒我要转换为整型。显式设置id类型为Int64有效。 - undefined
好的,所以这是一个编译时错误,现在它可以正常工作了(无论是编译时还是运行时)? - undefined
3个回答

11

正如下表所示,SQL Server的bigint映射到.NET的Int64结构:

long id = 0;

//Omitted code

if (reader.Read())
{
    id = (long) reader["id"];
}

如果这里抛出了一个 InvalidCastException,那么你的数据库中可能没有 bigint 类型的数据,你可能需要在调试器中使用 reader["id"].GetType() 来检查实际类型。

顺便提一下,你会注意到我用 long id = 0; 替换了你的 var id = 0;,这实际上是声明了一个 Int64 类型的变量,而不是 Int32。如果你想使用 C# 变量推断,请确保选择正确的方式:var id = 0L;

顺便说一句,如果你不想进行类型转换,你可以尝试这个替代方法:

long id = 0;

//Omitted code

if (reader.Read())
{
    id = reader.GetInt64(reader.GetOrdinal("id"));
}

1

1
也许问题出在你的初始声明中使用了var。这是一个隐式类型变量,只有在第一次使用时才会赋值。因为你将它赋值为0,所以它被认为是一个int类型。
将声明替换为Int64或long id = 0,问题就应该解决了。

你也可以这样做:var id = 0L; - undefined
没错,但我更喜欢将var限制为真正的匿名类型,比如Linq中的投影。除非你知道预期的数据类型。这有点懒散的编码方式,可能会给你带来麻烦 :) - undefined
在这种情况下,使用var与匿名类型无关。 - undefined
你可以在匿名类型(var x = new { .... })中使用var,但是这里的id从声明的那一刻起就是一个int。它并没有匿名性可言。 - undefined
是的,你是对的,我改成了隐式。但在这些情况下,我仍然不会使用 var。 - undefined
@Pleun: 我也不会,很难确定id的类型是什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接