初学vb.net开发 尝试开发一个进销存软件 有很多方法不熟悉 求指正和帮助 (连载1 登录窗口)
然后建数据库
表名 UserLog 用来保存登录的历史记录 结构如下
表名 管理员 结构如下
然后下面奉上Login.vb的代码
Public Class Login
Private daLogin As OleDb.OleDbDataAdapter
Private cbLogin As OleDb.OleDbCommandBuilder
Private dtLogin As DataTable
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
'点击退出按钮
Me.Close()
End Sub
Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
'点击登录按钮
CheckLogin()
End Sub
Private Sub CheckLogin()
'核对账号和密码
Dim Found As Boolean
Dim i As Integer
Dim errMessage As String = "该账号不存在"
cboUser.Focus()
cboUser.SelectAll()
For i = 0 To dtAdmin.Rows.Count - 1
If dtAdmin.Rows(i)("用户名").ToString = cboUser.Text Then
If dtAdmin.Rows(i)("密码").ToString = txtPassword.Text Then
Found = True
AdminIndex = i
Exit For
Else
errMessage = "密码错误"
txtPassword.Focus()
txtPassword.SelectAll()
End If
End If
Next i
If Found Then '登录成功
AddUserLog(i) '添加登录历史记录
mdiMain.Show() '载入主界面
LoginOk = True
Me.Close()
Else
MessageBox.Show(errMessage, "错误提示")
End If
End Sub
Private Sub AddUserLog(ByVal Index As Integer)
'添加到登录记录
Dim loginIndex As Integer = cboUser.FindStringExact(cboUser.Text)
If loginIndex > -1 Then
dtLogin.Rows(loginIndex)("password") = dtAdmin.Rows(Index)("密码")
dtLogin.Rows(loginIndex)("lasttime") = Now
dtLogin.Rows(loginIndex)("savepass") = chkRemember.Checked
dtLogin.Rows(loginIndex)("autolog") = chkAutoLog.Checked
Else
Dim NR As DataRow = dtLogin.NewRow()
NR("UserName") = dtAdmin.Rows(Index)("用户名")
NR("PassWord") = dtAdmin.Rows(Index)("密码")
NR("LastTime") = Now
NR("SavePass") = chkRemember.Checked
NR("AutoLog") = chkAutoLog.Checked
dtLogin.Rows.Add(NR)
End If
daLogin.Update(dtLogin)
End Sub
Private Sub Login_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'窗体关闭
dtLogin.Dispose()
cbLogin.Dispose()
daLogin.Dispose()
If Not LoginOk Then '如果未登录
dtAdmin.Dispose()
cbAdmin.Dispose()
daAdmin.Dispose()
Conn.Dispose()
End If
End Sub
Private Sub Login_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
OpenConn() '连接数据库
ListLastUsers() '列出最后登录的用户列表
If Not LoginOk Then LoadAdmin() '装入管理员数据
Conn.Close() '关闭数据库
If chkAutoLog.Checked And Not LoginOk Then CheckLogin() '如果自动登录则登录
End Sub
Private Sub ListLastUsers()
'列出最后一次登录的用户
Sql = "select * from UserLog order by LastTime desc"
daLogin = New OleDb.OleDbDataAdapter(Sql, Conn)
cbLogin = New OleDb.OleDbCommandBuilder(daLogin)
'========对Access数据库保留字的处理===========
cbLogin.QuotePrefix = "["
cbLogin.QuoteSuffix = "]"
'=====================================
dtLogin = New DataTable
daLogin.Fill(dtLogin)
If dtLogin.Rows.Count > 0 Then
For i = 0 To dtLogin.Rows.Count - 1
cboUser.Items.Add(dtLogin.Rows(i)("UserName"))
Next i
cboUser.SelectedIndex = 0
End If
End Sub
Private Sub cboUser_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboUser.SelectedIndexChanged
'当用户改变时 根据数据库改变控件状态
chkRemember.Checked = CBool(dtLogin.Rows(cboUser.SelectedIndex)("savepass"))
If chkRemember.Checked Then
chkAutoLog.Checked = CBool(dtLogin.Rows(cboUser.SelectedIndex)("autolog"))
txtPassword.Text = dtLogin.Rows(cboUser.SelectedIndex)("Password").ToString
End If
End Sub
Private Sub chkRemember_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkRemember.CheckedChanged
'如果选了记住密码才显示自动保存
If chkRemember.Checked Then
chkAutoLog.Enabled = True
Else
chkAutoLog.Enabled = False
End If
End Sub
Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
'点击移除当前登录记录
dtLogin.Rows(cboUser.SelectedIndex).Delete()
cboUser.Items.RemoveAt(cboUser.SelectedIndex)
btnRemove.Enabled = False
txtPassword.Text = ""
chkRemember.Checked = False
chkAutoLog.Checked = False
daLogin.Update(dtLogin)
End Sub
Private Sub cboUser_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboUser.TextChanged
'文字改变时调整相应控件
If cboUser.FindStringExact(cboUser.Text) > -1 Then
btnRemove.Enabled = True
Else
btnRemove.Enabled = False
txtPassword.Text = ""
chkRemember.Checked = False
chkAutoLog.Checked = False
End If
End Sub
End Class
有一些变量或过程写在module里
Public LoginOk As Boolean '登录成功
Public AdminIndex As Integer '管理员索引
Public Conn As OleDbConnection
Public daAdmin As OleDbDataAdapter
Public cbAdmin As OleDbCommandBuilder
Public dtAdmin As DataTable
Public Sql As String
Public Sub OpenConn()
Conn = New OleDbConnection
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Data.mdb"
Conn.Open()
End Sub
Public Sub LoadAdmin()
Sql = "select * from 管理员"
daAdmin = New OleDbDataAdapter(Sql, Conn)
cbAdmin = New OleDbCommandBuilder(daAdmin)
dtAdmin = New DataTable
daAdmin.Fill(dtAdmin)
AddHandler daAdmin.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)
End Sub
Private Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)
Dim newID As Integer = 0
Dim idCMD As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", Conn)
If args.StatementType = StatementType.Insert Then
newID = CInt(idCMD.ExecuteScalar())
args.Row("ID") = newID
End If
End Sub
我个人感觉 对登录这样简单的操作用dataTable感觉很不爽 但我真的不知道怎么去写 另外我用循环遍历dataTable取符合条件的记录感觉非常傻和没有效率 求一般应该怎么写比较好
[解决办法]
你该不会就这样 一个窗口 一个功能的 要别人贴代码吧!
[解决办法]
做这种东西不要愤青。做完了就封装控件调用,然后暂时不要去纠结它了。
------解决方案--------------------
有本事“不爽这个不爽那个”的,那么下一个任务点时去另外设计一种机制。不要在以前的东西上纠扯“不刷这个不爽那个”。这是两种态度,一种是不断开发新的组件,一种是刚做了一个组件就以为自己高级了、再也不用开发新的组件的、就该负责批评以前的组建了。后者是很不好的,你的探索精神完全可以在下一个组件的设计中体现,而不用纠缠于非要重写已经开发出来、而且目前还在正常运行的组件。
[解决办法]
如果你用过VB6的RecordSet,你可以用用DataReader对象。
[解决办法]
ado.net肯定比ado强大好用的多。
有个详细对比看一下 就ok了