使用c#和ExecuteCommand返回指示文件是否存在的sql值

时间:2011-12-08 17:35:35

标签: sql linq executequery

道歉,如果这个问题已在其他地方得到解答,但我已经四处看看并且没有运气。我正在尝试使用mvc3和c#来确定数据库表是否已存在。

我将以下sql放入resx文件中调用:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[%tableName%]') AND type in (N'U'))
SELECT 1
ELSE 
SELECT 0

这在Management Studio中运行正常,但是我无法在我的c#项目中使用它,我尝试这样调用它:

public bool GetIsInstalled(string tableName)
        {
            return _db.ExecuteCommand(Scripts.CheckIfInstalled.Replace("%tableName%", tableName))==1;
        }

当我调试方法时,返回的值实际上是-1,所以我想某处出了问题?我在想,我可能需要执行查询而不是命令?有人可以帮我解决这个问题,请尽可能提供代码示例吗?

3 个答案:

答案 0 :(得分:1)

ExecuteCommand方法返回已执行命令修改的行数。在这种情况下,这不是你想要的。相反,您应该使用ExecuteQuery方法:

return db.ExecuteQuery<int>(
    Scripts.CheckIfInstalled.Replace("%tableName%", tableName)
).Single().Equals(1);

答案 1 :(得分:0)

尝试这个更简单的查询:

SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[%tableName%]') AND type in (N'U')

另外,请检查连接字符串中指定的用户是否可以访问systables。

答案 2 :(得分:0)

我不知道您使用的是哪种数据库接口,但是如果您使用的是System.Data.SqlClient.SqlCommand,那么您可以执行类似

的操作
object result = cmd.ExecuteScalar();

顺便说一下:你可以使用:

SELECT COUNT(*) FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[%tableName%]') AND type=N'U';