Trong giáo trình có rồi đó bạn Mã: Imports System.Data.OleDb Public Class database 'Kết nối đến file dữ liệu Dim gscon As String = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = data.mdb;" Public cnn As New OleDbConnection(gscon) End Class
ái chà, mình mới nhìn cái tiêu đề, ai ngờ nội dung nó khác . Trước hết, bạn tạo một lớp kết nối CSDL (chắc bạn đã tạo xong rồi) Tiếp theo, tạo một hàm thực hiện câu lệnh đếm và trả về số lượng bản ghi Mã: Public Function doCount(ByVal sqlStr) As Integer connect() cmd = New SqlCommand(sqlStr, _conn) Dim count as interger = cmd.ExecuteScalar() closeDb() Return count End Function Trong form đăng nhập, bạn tạo 2 textbox (username và password), 1 nút "Login". Double click lên nút Login để xử lý nút này. Tại đây, bạn khai báo 1 biến đếm, viết câu lệnh sql: sqlstr = "select count(username) from user where username = '" & txtusername.Text & "' and password = '" & password.Text & "'" dem = doCount(sqlstr) Khi biến dem đã nhận giá trị, bạn kiểm tra: Nếu biến đếm lớn hơn 0 (tức là thông tin đăng nhập đúng) thì ẩn cái form đăng nhập đi và cho hiện cái form main lên, ngược lại thì thông báo lỗi thông tin đăng nhập. Mình nói thế hi vọng bạn hiểu và tự làm được, còn đưa nguyên code lên đây chỉ là hạ sách. Có gì bạn cứ nói, mình giúp cho. Chúc thành công nhé!
cái này mình viết nhưng tới đoạn màu đỏ ở trên nó bị lỗi Error2'System.Data.Sql' is a namespace and cannot be used as an expression.C:\Users\Admin\Desktop\QLDiemSV\QLDiemSV\DangNhap.vb1631QLDiemSV
Không, ở class CSDL thì mình không ý kiến gì, nhưng ở class DangNhap của bạn, mình có ý kiến xí, bạn xem rồi rút kinh nghiệm. Mã: Dim connstring As String = "provider = Microsoft.jet.oledb.4.0; data source = QlDiemSV.mdb" Dim mydata = New OleDbDataAdapter("select * from DANGNHAP where TenDN ='" + Me.txtTenDN.Text + "' and MatKhau= '" + Me.txtMatKhau.Text + "'", connstring) Mình không biết đoạn này đặt ở đây có tác dụng gì? Mã: If db.initDataset(sql as string) > 0 Then 1. Thủ tục initDataset bạn tạo ở lớp CSDL có tham số truyền vào là một chuỗi, trong khi tham số của bạn truyền vào là sql as string (cái này thì khai báo biến cũng không phải, chuỗi càng không đúng) 2. Thủ tục initDataset bạn tạo ở lớp CSDL có tác dụng điền dữ liệu lấy được sau khi thực hiện câu truy vấn vào một CSDL ảo (DataAdapter) - cái này thường hay sử dụng khi muốn lấy dữ liệu từ csdl đổ lên datagreatview, chứ khi dùng để đếm số lượng bản ghi, nó trở nên thừa và cồng kềnh. Nếu theo ý bạn, thì không phải là If db.initDataset(sql as string) > 0 Then mà là If mydata.row.count > 0 Then...... Mình xin sửa lại một xí như sau (mình giải thích ngay trong code luôn cho tiện) Mã: Imports System.Data.OleDb Public Class CSDL 'Khai báo đối tượng Public myconn As New OleDbConnection Public mycom As OleDbCommand Public mydata As OleDbDataAdapter Public mydataset As DataSet 'Thủ tục kết nối CSDL Public Sub connectDB() Dim connstring As String = "provider = Microsoft.jet.oledb.4.0; data source = QlDiemSV.mdb" myconn.ConnectionString = connstring myconn.Open() If (myconn.State <> ConnectionState.Open) Then MsgBox("Kết nối không thành công") 'nếu kết nối không thành công thì báo ko thành công, còn kết nối thành công rồi thì không báo gì cả, tiếp tục làm mấy việc khác thôi End If End Sub ' Thủ tục đóng kết nối Public Sub closeDB() If (myconn.State <> ConnectionState.Closed) Then myconn.Close() End If End Sub Public Sub doSQL(ByVal sql As String) mycom = New OleDbCommand(Sql, myconn) mycom.ExecuteNonQuery() End Sub Public Sub initDataset(ByVal sql As String) mydata = New OleDbDataAdapter(sql, myconn) mydataset = New DataSet mydata.Fill(mydataset) End Sub End Class 'tạo thêm một hàm, phương thức thực thi là ExecuteScalar, bạn xem lại công dụng của phương thức này trong giáo trình, có 3 phương thức đó. Hàm này có công dụng là đếm số lượng bản ghi truy vấn được và trả về giá trị, là số nguyên. Public Function doCount(ByVal sqlStr) As Integer connectDB() mycom = New OleDbCommand(sqlStr, myconn) Dim count As Integer = mycom.ExecuteScalar() closeDB() Return count End Function Mã: Imports System.Data.OleDb Public Class DangNhap Dim db As New CSDL Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If ((txtTenDN.Text = "") Or (txtMatKhau.Text = "")) Then MsgBox("Yêu cầu nhập tên và mật khẩu") Else Dim str As String = "Select count(TenDN) from DANGNHAP where TenDN ='" & Me.txtTenDN.Text & "' and MatKhau= '" & Me.txtMatKhau.Text & "'" If db.doCount(str) > 0 Then MsgBox("Đăng nhập thành công") Me.Hide() Main.ShowDialog() Else : MsgBox("Sai tên truy cập hoặc mật khẩu") End If End If End Sub Mình code chay nên không biết chạy đúng không, nhưng nguyên tắc vẫn là thế. Bạn test xem, lỗi gì thì nói tiếp để mình giúp.
If db.doCount(str) > 0 Then Conversion from string "Select * from DANGNHAP where Ten" to type 'Integer' is not valid. Vẫn bị lỗi chỗ này >.<
Bạn thay cái dấu "+" trong câu lệnh truy vấn thành dấu "&" xem Dim str As String = "Select * from DANGNHAP where TenDN ='" & Me.txtTenDN.Text & "' and MatKhau= '" & Me.txtMatKhau.Text & "'"
Code mình một đường bạn làm một nẻo , xem lại cái hàm của mình viết rồi so sánh Mã: Public Function doCount(ByVal sql As Integer) 'thiếu kiểu dữ liệu trả về, tham số truyền vào là chuổi chứ không phải là số nguyên connectDB() mycom = New OleDbCommand(Sql, myconn) Dim count As String = mycom.ExecuteScalar() 'biến count lưu giá trị số nguyên (số lượng kết quả trả về) closeDB() Return count End Function Sửa lại một xí ở câu lệnh truy vấn Dim str As String = "Select count(TenDN) from DANGNHAP where TenDN ='" & Me.txtTenDN.Text & "' and MatKhau= '" & Me.txtMatKhau.Text & "'" Mã: Me.Hide() Main.ShowDialog() Như thế này thì khi đăng nhập thành công nó hiện cáu form mail và vẫn hiện cái form đăng nhập, đảo ngược 2 cái này lại.
Mã: 'tạo thêm một hàm, phương thức thực thi là ExecuteScalar, bạn xem lại công dụng của phương thức này trong giáo trình, có 3 phương thức đó. Hàm này có công dụng là đếm số lượng bản ghi truy vấn được và trả về giá trị, là số nguyên. Public Function doCount(ByVal sqlStr) As Integer connectDB() mycom = New OleDbCommand(sqlStr, myconn) Dim count As Integer = mycom.ExecuteScalar() closeDB() Return count End Function Đúng rồi chứ