【问题标题】:When user types their username in a txtbox the software crashes当用户在 txtbox 中输入他们的用户名时,软件崩溃
【发布时间】:2020-09-15 01:24:37
【问题描述】:

目前我正在尝试创建一个登录系统,用户注册该程序并在那里创建自己的用户名和密码,然后此用户名和密码将保存在 SQL 数据库中,这部分工作正常,但是,他们使用此用户名和密码登录系统的部分不起作用,我正在尝试做的是检查文本框中的用户名是否与数据库中的用户名之一相同这里是代码和感谢您的支持。

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Windows.Forms
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Public Class Form1

    Dim Array(100)

    Private Sub BtnSignUp_Click(sender As Object, e As EventArgs) Handles BtnSignUp.Click
        Dim con As SqlConnection
        Dim Insert As SqlCommand
   
        con = New SqlConnection("Data Source=DESKTOP-4U5G5M4;Initial Catalog=Profile;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False")
        con.Open()
        Insert = New SqlCommand("INSERT INTO EmployeeProfile (item_title) VALUES('" + TxtFirst.Text + "')", con)

        Insert.ExecuteNonQuery()
        con.Close() 
    End Sub






   Private Sub BtnLoginSQL_Click(sender As Object, e As EventArgs) Handles BtnLoginSQL.Click
    Dim Correct As Boolean = False
    Dim Pass As Boolean = False
    Dim Slc As New SqlCommand("", con)
    con.Open()
   
    Slc.CommandText = "SELECT item_title FROM EmployeeProfile"    
 
    If Slc.ExecuteScalar = TxtUsername.Text Then

        Correct = True

    End If

    If Correct = True And TxtUsername.Text = Nothing Then
        Correct = False
    End If

    If Correct = True Then
        PnlPersonInfo.Visible = False
        PnlLogin.Visible = False
        PnlHome.Visible = True
    End If
    con.Close()

End Sub

【问题讨论】:

  • 您通过调试解决了此类问题...我们无法阅读您的代码并轻松发现问题所在。但是你可以单步调试一个调试器并很容易地捕捉到它崩溃的地方。如果您仍然遇到困难,请发布其他信息,也许有人可以提供帮助。
  • 您在这篇文章中倾倒了太多代码。您有不完整的方法、注释代码以及大量与您的问题无关的代码。请参阅How to Askminimal reproducible example,并将代码减少到演示问题所需的绝对最小值
  • 您的选择 SQL 无效...并且应该使用参数,并且您的连接应该在 using 块内(假设 VB 有这些)。你是根据用户名选择的,没有密码?大安全漏洞。
  • 这个Slc.CommandText = ("SELECT * FROM EmployeeProfile (item_title) VALUES (" + TxtUsername.Text + ")") 是一个无效的选择语句
  • 哎呀,这看起来很可怕——容易受到 sql 注入问题的影响。

标签: sql sql-server vb.net


【解决方案1】:

当用户输入名称时,您的应用程序不会崩溃。当他点击按钮时我崩溃了。

Dim con As SqlConnection
con.Open()  

异常-(System.NullReferenceException:对象引用未设置为对象的实例。con 是 Nothing。)

你只给你的变量一个数据类型。这个连接是一个对象,必须创建。 New 关键字将调用连接的构造函数。

 Dim con As New SqlConnection()

当然,如果没有连接字符串,您将无法打开它。此外,您不应该在 .Execute... 方法之前直接打开它。

这是一个关于选择查询的小教程。 https://www.tutorialspoint.com/sql/sql-select-query.htm

您应该始终使用参数来避免 Sql 注入。在sql中查找参数。

连接需要关闭和处理。查找 Using...End Using 块来完成此操作。

然后再试一次,如果您有更多问题,请使用新代码再次询问。

【讨论】:

  • 嗨@Mary 我把'Slc.CommandText'放在'con.open'之后只是因为我不确定我是否需要执行才能工作。另外我只是想知道你是否知道哪个执行会选择所有列,如果不感谢你的建议:)
  • @JoshuaManicolo con.Open 应该直接在 .Execute... 行之前。连接是宝贵的对象,应该只在最短的时间内打开。
  • @JoshuaManicolo 为了快速和肮脏,您可以使用Select * From,但在生产代码中始终列出您要检索的列的名称。
猜你喜欢
  • 2013-06-14
  • 2021-06-17
  • 2015-02-10
  • 2017-11-08
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多