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

使用している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';
于 2011-12-08T17:45:41.283 に答える
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 に答える