查询MySQL时指定的强制转换无效

时间:2017-04-06 20:31:38

标签: c# mysql

通过MySQL.Data.Entity v6.9.9(当前版本)连接MySQL数据库。试图检索所有的列表 表通过直接SQL查询(在MyDBContext内):

public async Task<IEnumerable<DBTableInfo>> GetTablesAsync()
{
    string sql = @"SELECT TABLE_NAME Name, TABLE_ROWS NumRows 
        FROM information_schema.tables
        where TABLE_TYPE='BASE TABLE'
        order by TABLE_NAME;";
    var result = Database.SqlQuery<DBTableInfo>(sql);
    return await result.ToListAsync();
}

DBTableInfo的定义简单如下:

public class DBTableInfo
{
    public string Name { get; set; }
    public long NumRows { get; set; }
}

我收到错误:

  

指定的演员表无效。

违规行是return方法的GetTableAsync声明。发生错误的原因是 NumRows的{​​{1}}属性。如果我从DBTableInfo注释掉NumRows属性,则查询有效。

现在,DBTableInfoinformation_schema.tables定义为TABLE_ROWS。我的bigint对象 将相应的属性声明为DBTableInfo。即使此列不包含空值,我也尝试使用long, 它也不起作用。

为什么呢?任何关于处理它的最佳方法的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

通过将NumRows值转换为SQL中的签名版本,问题得以解决(更像是&#34;解决了#34;),如下所示:

CAST(TABLE_ROWS as SIGNED) NumRows

确保我的课程仍被定义为:

public class DBTableInfo
{
    public string Name { get; set; }
    public long NumRows { get; set; } // <-- ulong does not work!
}

通过这两个步骤,记录可以正确反序列化。

请注意,您不能使用ulong(无符号64位整数)作为NumRows的声明类型,因为 - 事实证明 - 实体框架仍然不支持无符号长整数< / strong>即可。我花了一段时间才重新学习这个。

以下是相关参考资料:

How to use unsigned int / long types with Entity Framework?

因此,您必须两者将数据库中的unsigned long值转换为签名版本,将类的接收成员声明为(signed){{ 1}}。

不幸的是,这使得MySQL方面的溢出错误空间开放。幸运的是,我的表格远不及那些会成为真正问题的行数。