首页 > 解决方案 > 如何使用 Database.SqlQuery<> 读取 Int64 和 Int32 值

问题描述

我编写了一个函数来使用模式名称和表名称作为输入参数来检查表中是否存在特定 ID。

如果找不到具有给定 ID 的记录,我创建的要在数据库上执行的查询将返回 -2,如果找到项目,则返回其 ID。

private long isThisNodeAlreadyInsertedInDatabaseByHeadquarter(
    string schemaName
    string tableName,
    string primaryNodeId,
    string primaryKeyFieldName){

    string targetTableName = $"{schemaName}.{tableName}";
    string sqlCommandString2 = $"select COALESCE(MAX({primaryKeyFieldName}),-2)" + " " + Environment.NewLine +
                             $"from {targetTableName}" + " " + Environment.NewLine +
                              "WHERE " + " " + Environment.NewLine +
                               $"{primaryKeyFieldName}={foundID}";
    //will return -2 if not found otherwise return its id
    DbRawSqlQuery<Int64> result2 = rawDbContext.Database.SqlQuery<Int64>(sqlCommandString2);
    long foundID = result2.Single();
    return foundID;
}

我的问题是我的数据库中的一些主键是类型的,Int而一些主键的类型BigInt分别相当于 C# 中的和(或Int32分别)。Int64intlong

当我读取 BigInt 类型的表的主键时,没有任何错误发生,但是当我想读取 Int 类型的表的主键时,它会导致异常:

{“从物化 'System.Int32' 类型到 'System.Int64' 类型的指定转换无效。”}

尽管可以将 int 存储在 long 变量中,但转换Int32Int64inDatabase.SqlQuery会导致此异常。我想知道这种情况是否有任何解决方法,或者我只需要使用读取值SqlDataReader.ExecuteReader

标签: c#sql-serverentity-frameworkado.netdbcontext

解决方案


将 PK 转换为BIGINTin 查询并读取为Int64

"select CONVERT(BIGINT,COALESCE(MAX({primaryKeyFieldName}),-2))"

此外,您可以COALESCEISNULL函数替换:

"select CONVERT(BIGINT,ISNULL(MAX({primaryKeyFieldName}),-2))"

推荐阅读