1

我的 ASP.Net 应用程序的数据层调用一个存储过程,以在登录时获取少量(一条记录)有关访问者的信息。我传入他们的电话号码和存储过程,使用一个简单的 SELECT,传回 5 个字段,其中第一个是主键,一个 BIGINT。我的数据层获取 DataRow 并尝试用它创建一个数据对象。在数据对象中,表示主键的属性是一个 Int64。看起来像这样:

 sub = new PersistentSubscriber((String) dr["UserFirstName"],
        (String) dr["UserLastName"],
        phoneNumber, (Int64) dr["UserId"], (Byte) dr["SubscriberStatus"]);

我发现当我有一个大的主键值(例如 88698)时,一切都很好。但是,当我得到一个小的主键值(如 999)时,我在尝试设置时收到“Specified Cast is Invalid”错误该主键属性。当我尝试在立即窗口中使用它时,我得到了这个:

?(Int64)dr["UserId"]
Cannot unbox 'dr["UserId"]' as a 'long'
?(int)dr["UserId"]
999
?(Int32)dr["UserId"]
999

如果不求助于类型化的数据集,我在这里做错了什么?

4

2 回答 2

2

当然,我正在挖掘一个老问题,但它出现在顶部附近的谷歌搜索中,所以为什么不......

你听说过DataSetExtensions吗?它们允许您以强类型的方式访问 DataRow 中的字段。这在 linq 查询中非常有用,根据我的经验,它比调用 DataTable.Select() 快得多。

只需添加对System.Data.DataSetExtensions项目的引用,就可以使用它们了。

在示例中:

Int64 value = dr.Field<Int64>("UserId");

dr.SetField("UserId", value);
于 2013-01-26T20:52:13.400 回答
1

试一试Int64.TryParse

long userId;
if(Int64.TryParse(dr["UserId"], out userId))
{
    // successful conversion
}
于 2010-06-04T23:34:49.630 回答