代码之家  ›  专栏  ›  技术社区  ›  VSB

如何使用Database.SqlQuery同时读取Int64和Int32值

  •  1
  • VSB  · 技术社区  · 6 年前

    我已经编写了一个函数,用表名和表名作为输入参数来检查表中是否存在特定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 相当于 Int32 Int64 分别为C#(或 int long 分别)。

    当我读取BigInt类型表的主键时,不会发生任何错误,但当我要读取Int类型表的主键时,会导致异常:

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

    尽管可以将int存储在长变量中,但是 国际32 国际64 在里面 Database.SqlQuery 导致此异常。 我想知道在这种情况下是否有解决方法,或者我只需要使用 SqlDataReader.ExecuteReader ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Backs    6 年前

    将主键转换为 BIGINT 查询并读取为 Int64 :

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

    另外,你可以替换 COALESCE 具有 ISNULL 功能:

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