【问题标题】:How can I read both Int64 and Int32 values using Database.SqlQuery<>如何使用 Database.SqlQuery<> 读取 Int64 和 Int32 值
【发布时间】:2019-12-25 08:00:24
【问题描述】:

我编写了一个函数来检查表中是否存在特定 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# 中的 Int32Int64(或 intlong分别)。

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

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

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

【问题讨论】:

    标签: c# sql-server entity-framework ado.net dbcontext


    【解决方案1】:

    在查询中将PK转换为BIGINT,读为Int64

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

    另外,您可以将COALESCE 替换为ISNULL 函数:

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

    【讨论】:

    • 从方法的标题中,我认为 If Exists 会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多