VB.net 用户登陆界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.net 用户登陆界面相关的知识,希望对你有一定的参考价值。

“System.Data.OleDb.OleDbException”类型的未经处理的异常出现在 System.Data.dll 中。其他信息: 至少一个参数没有被指定值。 下面附上源代码:
Dim yhm As String, pass As String
Static i As Integer
yhm = Trim(TextBox1.Text)
pass = Trim(TextBox2.Text)
myzx.CommandText = "select * from 用户信息 where 用户信息ID='" & yhm & "'" & " and Password='" & pass & "'"
myzx.Connection = mylj
mylj.Open()
myread = myzx.ExecuteScalar
myadapt.Fill(mysjcc, "用户信息")
If myread Then
Formmain.Show()
Me.Hide()
Else
i = i + 1
If i >= 3 Then
MsgBox("您已经错误三次,您无资格登陆本系统!", vbExclamation + vbOKOnly, "警告!")
End
Else
Dim yy As Integer
yy = MsgBox("用户名或密码错误,请重新输入!", vbRetryCancel + vbExclamation, "警告!")
If yy = MsgBoxResult.Retry Then
TextBox1.Text = ""
TextBox2.Text = ""
TextBox1.Focus()
Else
End
End If
End If
End If
mylj.Close()
公共区域已定义
Dim mylj As New OleDb.OleDbConnection
Dim myadapt As New OleDb.OleDbDataAdapter
Dim myzx As New OleDb.OleDbCommand
Dim mysjcc As New DataSet
Dim myread As Object
Public yhm As String, pass As String
Dim ljstring As String

参考技术A 首先要做个登录界面,并使用按钮事件
满意请采纳。追问

你说的我已经都做好了,主要的问题是这个代码所对应的System.Data.OleDb.OleDbException”类型的未经处理的异常出现在 System.Data.dll 中。其他信息: 至少一个参数没有被指定值。没法解决

本回答被提问者采纳

VB.NET多线程入门

最近项目中遇到了一个处理速度慢堵塞用户界面操作的问题,因此想用多线程来解决。

在处理数据的循环中,新建线程,在新建的线程中处理数据。多线程同时处理数据,以此来达到加速的目的,使用户界面操作变得流畅。

在多任务操作系统中,我们可以在操作系统的协调下同时进行多个任务。各个任务以分时复用的形式来进行工作。Windows操作系统通过进程ID来管理各进程,每个进程至少包含一个线程,线程是进程中可以独立运行的程序片段。在主程序运行时,主程序可以启动线程,线程与主程序同时运行。线程是系统中分时处理的最小单位,也就是说线程可以与主程序并行运行,参与同分时处理。线程有自己独立的栈处理数据,它在与主程序同时运行时可以共享主程序定义的变量、函数。只有当线程运行结束才把控制权还给主程序。

创建线程最直接的方法是创建新的线程类实例,并使用Address Of语句为运行的过程传递委托。但是这种方法不能传递参数和返回值。

我们可以通过将在单独的线程中运行的过程包装到类或结构中,为它们提供参数,并使之能返回参数。

下面是一个新建线程的小demo:

Class TasksClass
    Public StrArg As String
    Public RetVal As Boolean
    Public resultFlag As Boolean

    Public Event ResultEvent(ByVal resultFlag As Boolean)

    Public Sub SomeTask()
        ' 将 StrArg 字段用作参数。
        MessageBox.show("StrArg 包含字符串" & StrArg)
        RetVal = True ' 设置返回参数的返回值。
    End Sub
End Class
Public Class Test

    Private Sub Test_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DoWork()
    End Sub

    ' 要使用类,请设置存储参数的属性或字段,
    ' 然后,根据需要异步调用方法。
    Sub DoWork()
        Dim Tasks As New TasksClass()
        Dim Thread1 As New System.Threading.Thread(AddressOf Tasks.SomeTask)
        Tasks.StrArg = "参数A" ' 设置用作参数的字段。
        Thread1.Start() ' 启动新线程。
        Thread1.Join() ' 等待线程 1 运行结束。
        ' 显示返回值。
        MessageBox.show("线程 1 返回值" & Tasks.RetVal)

    End Sub
End Class

这样一个线程就被新建出来了。


但是事实上,创建过多的线程反而会影响性能,因为各个线程之间是分时复用的,操作系统需要在它们之间不断的切换,线程过多的时候,大量的时间消耗在线程切换上。

所以需要控制线程的数量。

假设我们只新建10个线程,剩余的数据等待这10个线程中的某个结束,再继续新建线程处理数据。使线程的总数一直保持在10个。

Public Class ThreadingObj
    Public paper As WorkSpace
    Public Sub ThreadingInsertPaper()
        '多线程处理数据
    End Sub
End Class
Private PaperList As List(Of WorkSpace) = New List(Of WorkSpace)
Dim ThreadingList As List(Of System.Threading.Thread) = New List(Of System.Threading.Thread)
For Each paper In PaperList
    '多线程处理PaperList
    If ThreadingList.Count < 10 Then  
    '不到10个线程则继续新起线程  
        Dim ThreadingObject As New ThreadingObj  
        Dim ThreadingTask_1 As New System.Threading.Thread(AddressOf ThreadingObject.ThreadingInsertPaper)  
        ThreadingObject.paper = paper  
        ThreadingList.Add(ThreadingTask_1)  
        ThreadingTask_1.Start() ' 启动新线程。  
    Else  
        Dim goOnFlag As Boolean = False  
        '循环等待有线程结束  
        Do  
            If CheckThreadingStatus() Then  
                '存在已完成的线程  
                If ThreadingList.Count <= 10 Then  
                    Dim ThreadingObject As New ThreadingObj  
                    Dim ThreadingTask_1 As New System.Threading.Thread(AddressOf ThreadingObject.ThreadingInsertPaper)  
                    ThreadingObject.paper = paper  
                    ThreadingList.Add(ThreadingTask_1)  
                    ThreadingTask_1.Start() ' 启动新线程。  
                    goOnFlag = True  
                End If  
            Else  
                '所有线程都在进行中  
            End If  
        Loop Until goOnFlag = True  
    End If
Next
Function CheckThreadingStatus() As Boolean
    '返回True表示存在已完成的线程
    If ThreadingList.Count <= 10 Then
        For Each ThreadingTaskItem In ThreadingList
            'ThreadingTaskItem.IsAlive
            If ThreadingTaskItem.IsAlive = False Then
                ThreadingTaskItem.Abort()
                ThreadingList.Remove(ThreadingTaskItem)
                Return True
            End If
        Next
    End If
    Threading.Thread.Sleep(100)
    If ThreadingList.Count <= 10 Then
        For Each ThreadingTaskItem In ThreadingList
            If ThreadingTaskItem.IsAlive = False Then
                Return True
            End If
        Next
    End If
    Return False
End Function

假设操作系统中有50个活跃的线程,如果我们的程序只有一个线程,那么程序就占用了系统资源的五十分之一。如果此时再多开一个线程,那么就占用了系统资源的2/51。我们的程序占用的资源越多,处理速度也就会更快一些。

因为各个线程之间是分时复用的,所以活跃的线程数量也会影响程序的效率。

有一种说法是2N + 2个线程数,是最有效率的。N是CPU的核数。但是这一说法也一直存在争议。

我的测试结果如下(我的电脑是i7 4770 ,四核八线程):

线程数123456789101115
耗时753409345316305286280282273273264266

测试的结果有点奇怪。。。。。。。

可能跟一些其他的因素也有关系。。。比如DB的状态,比如浏览网页对CPU的占用

以上是关于VB.net 用户登陆界面的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 12.10图形化界面登陆root用户,不显示登陆界面

WPF登陆界面验证登陆的问题

ubuntu不能登录图形用户界面,游客身份可登陆,命令行可登陆

用户登陆界面AJAX

[Django]登陆界面以及用户登入登出权限

登陆界面出现用户名:ASPNET,不知道密码也无法使用administrator用户名登陆,望大神求救!!!!