C#.net从具体化的';System.Int32';键入';System.Int64';类型无效
C#/.Net 4.6.1/Visual Studio 2017 我对MS SQL查询有问题。该查询跨两个数据库(在同一服务器上)连接多个表。结果进入“对象”列表。我得到的例外是: 指定的强制转换来自具体化的“System.Int32” “System.Int64”类型的类型无效 我已经看到了关于这个和类似错误的其他SO问题,但我没有看到这里的问题C#.net从具体化的';System.Int32';键入';System.Int64';类型无效,c#,.net,sql-server,C#,.net,Sql Server,C#/.Net 4.6.1/Visual Studio 2017 我对MS SQL查询有问题。该查询跨两个数据库(在同一服务器上)连接多个表。结果进入“对象”列表。我得到的例外是: 指定的强制转换来自具体化的“System.Int32” “System.Int64”类型的类型无效 我已经看到了关于这个和类似错误的其他SO问题,但我没有看到这里的问题personId是一个长字符。所有的…Id字段在数据库中为bigint,在模型中为long 查询是: try { var personId =
personId
是一个长字符。所有的…Id
字段在数据库中为bigint
,在模型中为long
查询是:
try {
var personId = GetPersonId(netid);
var personIdParam = new SqlParameter {
Value = personId,
DbType = DbType.Int64,
ParameterName = "PERSONID"
};
using (var pdb = new PersonnelContext()) {
var foo = pdb.Database.SqlQuery<PersonToSpaceInfo>(@"
SELECT
'Member',
sGroup.GroupId,
sGroup.PersonnelGroupId,
sGroup.Name,
Space.SpaceId,
Space.RoomId,
SiteSpaceUse.TypeDescription
FROM
Personnel.Personnel.Memberships AS Memberships
INNER JOIN Space.dbo.Person AS Person
ON Memberships.PersonId = Person.PersonnelPersonId
AND Person.PersonnelPersonId = @PERSONID
INNER JOIN Space.dbo.[Group] AS sGroup
ON Memberships.GroupId = sGroup.PersonnelGroupId
INNER JOIN Space.dbo.GroupList AS GroupList
ON sGroup.GroupId = GroupList.GroupId
INNER JOIN Space.dbo.Space AS Space
ON GroupList.SpaceId = Space.SpaceId
AND Space.IsActive = 1
INNER JOIN Space.dbo.SiteSpaceUse AS SiteSpaceUse
ON Space.SpaceId = SiteSpaceUse.SpaceId
WHERE GETDATE() BETWEEN Memberships.StartDate
AND ISNULL(Memberships.EndDate, GETDATE())
",
personIdParam).ToList();
}
} catch (Exception e) {
throw new Exception("get group list failed: " + e.Message);
}
堆栈跟踪:
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader,Int32序数)
lambda_法(闭合、整形器)
在System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper-Shaper)
位于System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleNumerator.MoveNext()
位于System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在C:\Users\me\Projects\MyProject\Controllers\HomeController.cs中的MyProject.Controllers.HomeController.GetUserActiveGroups(字符串用户)处:第560行
编辑
stacktrace中的第560行是上面的
var foo=pdb.Database…
行GetPersonId()
返回long
模型是使用代码优先接口创建的。以下是@mjwills请求的模型片段
GroupList.GroupId/
GroupList.SpaceId
public partial class GroupList {
public long GroupId { get; set; }
public long SpaceId { get; set; }
...
}
Memberships.GroupId/
会员资格
public partial class Membership {
public long PersonId { get; set; }
public long GroupId { get; set; }
...
}
Person.personalpersonid
public partial class Person {
public long PersonId { get; set; }
public long PersonnelPersonId { get; set; }
...
}
SiteSpaceUse.SpaceId
public partial class SiteSpaceUse {
public long SpaceId { get; set; }
...
}
Space.SpaceId
public partial class Space
public long SpaceId { get; set; }
public long BuildingId { get; set; }
...
}
sGroup.GroupId/
sGroup.PersonnelGroupId
public partial class Group {
public long GroupId { get; set; }
public long PersonnelGroupId { get; set; }
...
}
编辑2
只是尝试用一个有效的三位数替换查询中的SqlParameter
,我仍然得到错误。查询在SQLServerManagementStudio中工作。我将删除模型和连接字符串信息,然后重新创建,看看会发生什么
发生的是注意到变化…我修复了它。事实证明,其中一个DB上下文连接指向生产DB服务器。生成的错误消息没有帮助。这发生在哪一行?var personId=GetPersonId(netid)的作用是什么代码>实际返回(int32或int64)?stacktrace中的第560行是上面的
var foo=pdb.Database.SqlQuery(…)
行GetPersonId
returndlong
。您能通过声明personId是long吗?是的。更改var personId=GetPersonId(netid)代码>到长人形;personId=GetPersonId(netid)代码>编译并运行,同一个异常被抛出到同一个位置。@ClayVerValen:我没有看到与我的模型关联的XML文件。如果有区别的话,这些都是代码优先。如果你感兴趣的文件有一个特定的名字或应该住在一个特定的地方,请让我知道。我使用winGrep搜索
public partial class Group {
public long GroupId { get; set; }
public long PersonnelGroupId { get; set; }
...
}