私のプログラムでは、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!");
}
したがって、返される整数がわからないだけで、これが適切な方法であるかどうかはわかりません。
ありがとうございました。
ユーザーが存在するかどうかを確認する場合は、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();
...
}
レコードが存在するかどうかをチェックするために ExecuteScalar
を使用する必要があります。 ExecuteNonQuery
は、接続に対してtransact-SQLステートメントを実行し、UPDATE、INSERT、またはDELETEの影響を受ける行の数を返します。 SELECTステートメントには適用されません
Count(*)ではなくSelect Top 1 Idを使用します。
その整数値を取得するには、_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を変更してストアドプロシージャを使用します。
いつか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));