2013-07-27 34 views
14

trong chương trình của tôi không, tôi cần kiểm tra xem bản ghi trong cơ sở dữ liệu đã tồn tại trong bảng chưa bằng cách sử dụng câu lệnh if. sử dụng C# i đang cố gắng thực hiện điều này thông qua kết nối sql. như tôi cho rằng lệnh ExecuteNonQuery(); trả về giá trị số nguyên, nếu giả sử của tôi là đúng, tôi muốn biết giá trị nào là đúng để biết rằng một bản ghi nhất định tồn tại trong bảng hay không. đây là một mẫu mã của tôi:Kiểm tra xem bản ghi trong bảng có tồn tại trong cơ sở dữ liệu thông qua 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(); 
    } 
} 

xem xét sqlresult đã được khởi tạo trước đó trong chính như int sqlresult; vì vậy tôi muốn biết, rằng nếu thành viên này 'Adam' tồn tại trong cơ sở dữ liệu hay không. và nếu anh ta tồn tại, thì tôi muốn tiếp tục với tuyên bố 'nếu' nói ví dụ:

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

vì vậy tôi không biết số nguyên cần trả lại và tôi không chắc chắn rằng đây là cách thích hợp để làm điều đó.

cảm ơn bạn.

Trả lời

33

Nếu bạn muốn kiểm tra xem người dùng tồn tại, bạn phải thay đổi sql của bạn và sử dụng COUNT hoặc EXISTS:

Vì vậy, thay vì

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

này

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

Bây giờ bạn có thể sử dụng ExecuteScalar để truy xuất số lượng người dùng có tên người dùng và mật khẩu này:

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

Lưu ý rằng bạn nên sử dụng sql-thông số để ngăn chặn sql-injection:

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(); 
    ... 
} 
+1

Nó đáng chú ý là sqlCommand.ExecuteScalar() trả về một đối tượng không phải là một int: http://msdn.microsoft.com/en-us/library/system.data. sqlclient.sqlcommand.executescalar (v = vs.110) .aspx – TonE

+0

cảm ơn ví dụ tuyệt vời này, tôi có một câu hỏi, từ mã khối 'sử dụng' của bạn, là đối tượng cast thành int bị thiếu trong biến userCount? hoặc nó không cần thiết? – WhySoSerious

+1

@WhySoSerious: cảm ơn vì đã chú ý, tôi đã thêm nó vì nó bị thiếu. Vì @TonE đã đề cập nó là bắt buộc vì 'ExecuteScalar' trả về' đối tượng'. –

7

Bạn nên sử dụng ExecuteScalar để cheking nếu bản ghi tồn tại. ExecuteNonQuery chạy câu lệnh giao dịch-SQL đối với kết nối và trả về số hàng bị ảnh hưởng cho một UPDATE, INSERT hoặc DELETE. Nó không áp dụng cho các phát biểu SELECT

2

Bạn nên thực hiện count(1) trên bàn thay vì select * và sau đó executescalar để nhận giá trị số nguyên đó.

Sử dụng mã hiện tại của bạn tôi sẽ thay đổi nó để là:

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(); 
      } 
     } 

Xin lưu ý rằng tôi đã sử dụng tương đương với giá trị thay vì giá trị như thế nào.

Ngoài ra nếu tôi đã làm điều này, tôi sẽ thay đổi sql nội tuyến của bạn để sử dụng thủ tục được lưu trữ.

3

Tôi sẽ sử dụng Chọn Id Top 1 chứ không phải là count (*) vì nó có thể được nhanh hơn nhiều

0

Nếu một ngày nào đó bạn muốn sử dụng EF chỉ làm:

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)); 
} 

Hoặc làm một phương pháp chung chung, vì vậy bạn có thể xử lý nhiều entites:

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

Cách sử dụng:

EntityExists<Users>(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase) 
         && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase)); 
Các vấn đề liên quan