2011-12-08 20 views
0

如果這個問題已經在其他地方得到了解答,但是我已經沒有運氣了,我們已經回答了道歉。我試圖確定數據庫表是否已經存在使用mvc3和c#。使用c#和ExecuteCommand返回一個指示文件是否存在的sql值

而且我把下面的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,所以我猜這裏有什麼地方出錯了?我在想這可能是我需要執行查詢而不是命令?有人可以幫我解決這個問題嗎?如果可能,請提供一個代碼示例?

回答

1

ExecuteCommand方法返回被執行的命令修改的行數。這不是你想要的。相反,你應該使用ExecuteQuery方法:

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

感謝kevev讓它工作 – DevDave

0

試試這個簡單的查詢:

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

此外,檢查您的連接字符串中指定的用戶有權訪問SYSTABLES。

+0

感謝您的答覆,但是,它也返回-1錯誤 – DevDave

0

我不知道你使用的是哪種DB接口的,但如果你使用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'; 
+0

不好意思,我正在使用LINQ to SQL。我會給你的SQL一個嘗試,但我認爲它會因爲某種原因再次返回-1。想知道如果這是我從C#調用它的方式是什麼錯了? – DevDave

+0

正如kevev22所述,在Linq to Sql中使用'ExecuteQuery ',以便返回select查詢的結果。 ExecuteCommand將用於不返回結果的查詢,如UPDATE或INSERT查詢。 –

相關問題