web-dev-qa-db-ja.com

ExecuteNonQueryを使用して、テーブル内のレコードがデータベースに存在するかどうかを確認します

私のプログラムでは、ifステートメントを使用して、データベース内のレコードがテーブルに既に存在するかどうかを確認する必要があります。 C#を使用して、SQL接続を介してこれをしようとしています。 ExecuteNonQuery();コマンドが整数値を返すと仮定したので、私の仮定が真である場合、特定のレコードがテーブルに存在するかどうかを知るために真の値を知りたいです。ここに私のコードのサンプルがあります:

using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString")))
{
    using (SqlCommand sqlCommand = new SqlCommand("SELECT * from users where user_name like 'Adam' AND password like '123456'", sqlConnection))
    {
        sqlresult = sqlCommand.ExecuteNonQuery();
    }
}

sqlresultが以前にメインでint sqlresult;として初期化されているので、このユーザー 'Adam'がデータベースに存在するかどうかを知りたいと思います。そして、彼が存在する場合、たとえば、「if」ステートメントを続行したい:

if(sqlresult == 0)
{
   MessageBox.Show("Adam exists!");
}

したがって、返される整数がわからないだけで、これが適切な方法であるかどうかはわかりません。

ありがとうございました。

15
Albert A-w

ユーザーが存在するかどうかを確認する場合は、SQLを変更してCOUNTまたはEXISTSを使用する必要があります。

の代わりに

SELECT * from users where user_name like 'Adam' AND password like '123456'

この

SELECT COUNT(*) from users where user_name like 'Adam' AND password like '123456'

これで、ExecuteScalarを使用して、このユーザー名とパスワードを持つユーザーの数を取得できます。

int userCount = (int) sqlCommand.ExecuteScalar();
if(userCount > 0)
    // user exists ....

sql-injection を防ぐためにsql-parametersを使用する必要があることに注意してください。

using (SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) from users where user_name like @username AND password like @password", sqlConnection))
{
    sqlConnection.Open();
    sqlCommand.Parameters.AddWithValue("@username", userName);
    sqlCommand.Parameters.AddWithValue("@password", passWord);
    int userCount = (int) sqlCommand.ExecuteScalar();
    ...
}
40
Tim Schmelter

レコードが存在するかどうかをチェックするために ExecuteScalar を使用する必要があります。 ExecuteNonQueryは、接続に対してtransact-SQLステートメントを実行し、UPDATE、INSERT、またはDELETEの影響を受ける行の数を返します。 SELECTステートメントには適用されません

7
Claudio Redi

Count(*)ではなくSelect Top 1 Idを使用します。

4
Alireza Kousha

その整数値を取得するには、_select *_の代わりにcount(1)を実行してからexecutescalarを実行する必要があります。

既存のコードを使用して、次のように変更します。

_using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString")))
        {
            using (SqlCommand sqlCommand = new SqlCommand("SELECT count(1) from users where user_name = 'Adam' AND password = '123456'", sqlConnection))
            {
                sqlresult = sqlCommand.ExecuteNonQuery();
            }
        }
_

同じような値ではなく、等しい値を使用していることに注意してください。

また、これを行う場合、インラインsqlを変更してストアドプロシージャを使用します。

3
Avitus

いつかEFを使用したい場合は、次のようにします。

private MyDb db = new MyDb();

public bool UserExists(string userName, string password){

   return db.Users.Any(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase)
                         && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));
}

または、汎用メソッドを実行して、複数のエンティティを処理できるようにします。

public bool EntityExists<T>(Expression<Func<T, bool>> predicate) where T : class, new()
{
   return db.Set<T>().Any(predicate);
}

使用法:

EntityExists<Users>(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase)
                      && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));
0
Lucas