0

クラス内で、正常に動作するSQLへのログインを作成しています。ログインが SQL に既に存在するかどうかを最初に確認するために、少しエラー チェックを追加したかったのです。その場合は、ログインを追加しようとせずに、テーブルなどにマップします。

SQLでは、次を使用してログインを確認します。

select name from sys.server_principals where name = 'viewer2'

次のようにクラスでこれを使用するのにうんざりしました

protected static bool CheckForExistingUser(DbContext context, string userName)
        {
            string checkForUser =
                @" SET NOCOUNT ON
                    DECLARE @userName AS nvarchar(max) = {0}
                    EXEC('
                    SELECT name FROM sys.server_principals where name = ['+ @userName +']
                    ')";
            return Convert.ToBoolean(context.Database.ExecuteSqlCommand(checkForUser, userName));
        }

ただし、このメソッドを呼び出すと、列 (渡されたユーザー名) が無効であるという例外が発生します。

$exception  {"Invalid column name 'viewer2'."}  System.Exception {System.Data.SqlClient.SqlException}

これを引き起こしている原因についてのアイデアはありますか?コードからSQLデータベース内にログインが存在するかどうかを確認するより良い方法はありますか?

乾杯

4

3 に答える 3

3

'値の代わりに使用する必要があり[]ます。それ以外の場合、SQL サーバーはそれを列名として扱います。

string checkForUser =
    @" SET NOCOUNT ON
        DECLARE @userName AS nvarchar(max) = {0}
        EXEC('
        SELECT name FROM sys.server_principals where name = ''' + @userName +'''
        ')";
于 2013-04-05T20:45:14.953 に答える