0

抱歉,如果问题已经在其他地方得到回答,但我已经环顾四周,没有运气。我正在尝试使用 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,所以我猜某处有问题?我在想可能是我需要执行查询而不是命令?有人可以帮我解决这个问题,如果可能的话,请提供一个代码示例?

4

3 回答 3

1

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

return db.ExecuteQuery<int>(
    Scripts.CheckIfInstalled.Replace("%tableName%", tableName)
).Single().Equals(1);
于 2011-12-08T17:48:16.937 回答
0

试试这个更简单的查询:

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

此外,检查连接字符串中指定的用户是否有权访问 systables。

于 2011-12-08T17:40:19.697 回答
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';
于 2011-12-08T17:45:41.283 回答