Почему этот ExecuteQuery вызывает InvalidCastException? - PullRequest
1 голос
/ 28 ноября 2011

Я получаю InvalidCastException при вызове First () в последней строке. Может кто-нибудь сказать мне, почему?

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 ]

3 голосов
/ 28 ноября 2011

Попробуйте:

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

Дело в том, что результатом является строка, а приведение, очевидно, не выполняется. если бы вы могли сделать Convert.ToBool("true|false"), это бы сработало.

2 голосов
/ 28 ноября 2011

Тип данных бита SQL соответствует .NET bool. Он использует 1 и 0 для значений true и false. Попробуйте изменить код на:

IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 1 ELSE SELECT 0
1 голос
/ 02 декабря 2011

Оба следующих двух формата работают правильно. Суть проблемы заключается в том, какой тип возвращается ExecuteQuery.

SELECT 'true' фактически возвращает строку, а не bool - таким образом, при использовании этого формата переменная результата ExecuteQuery также должна быть строкой (а не bool)

И при использовании SELECT 1 в соответствии с рекомендациями @Eben Roux и @Anders Abel, результирующая переменная 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, ответы которых указали мне на окончательное решение (я). Я отметил ваши ответы как полезные, поскольку они направили меня в правильном направлении, чтобы получить окончательный ответ - спасибо, ребята :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...