当我在最后一行调用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();
}
答案 0 :(得分:3)
尝试:
IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 1 ELSE SELECT 0
问题是结果是一个字符串,显然,演员表失败了。如果你可以做Convert.ToBool("true|false")
它会起作用。
答案 1 :(得分:2)
SQL位数据类型对应于.NET的bool
。它使用1
和0
表示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,他的答案指向了最终的解决方案 - (我标记你的答案是有用的,因为他们引导我朝着正确的方向得到最终的答案 - 谢谢你们:))