为什么这个ExecuteQuery导致InvalidCastException?

时间:2011-11-28 12:28:35

标签: c# linq linq-to-sql casting

当我在最后一行调用First()时,我得到InvalidCastException。谁能告诉我为什么?

static bool TableExists(string tableNameAndSchema) 
{
    string checkTable =
        String.Format(
        "IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 'true' ELSE SELECT 'false'",
        tableNameAndSchema);            

    var result = db.ExecuteQuery<bool>(checkTable);
    return result.First();
}

3 个答案:

答案 0 :(得分:3)

尝试:

IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 1 ELSE SELECT 0

问题是结果是一个字符串,显然,演员表失败了。如果你可以做Convert.ToBool("true|false")它会起作用。

答案 1 :(得分:2)

SQL位数据类型对应于.NET的bool。它使用10表示true和false值。尝试将代码更改为:

IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 1 ELSE SELECT 0

答案 2 :(得分:1)

以下两种格式均可正常运行。挑战的核心似乎是ExecuteQuery返回的类型。

SELECT'true'实际上返回一个字符串而不是bool - 因此如果使用该格式,ExecuteQuery结果变量也必须是字符串(而不是bool)

当按照@Eben Roux和@Anders Abel的建议使用SELECT 1时,ExecuteQuery结果变量必须是int(而不是bool)

static bool TableExists(string tableNameAndSchema)
{
    string checkTable =
        String.Format(
        "IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 'true' ELSE SELECT 'false'",
        tableNameAndSchema);

    IEnumerable<string> result = db.ExecuteQuery<string>(checkTable);
    return Convert.ToBoolean(result.First());
}

static bool TableExists2(string tableNameAndSchema)
{
    string checkTable =
        String.Format(
        "IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 1 ELSE SELECT 0",
        tableNameAndSchema);

    IEnumerable<int> result = db.ExecuteQuery<int>(checkTable);
    return Convert.ToBoolean(result.First());
}

感谢@Eben Roux和@Anders Abel,他的答案指向了最终的解决方案 - (我标记你的答案是有用的,因为他们引导我朝着正确的方向得到最终的答案 - 谢谢你们:))