在我添加错误消息以检查 CapNum 是不是为空或已存在于数据库中之前,我的代码一直在工作

Posted

技术标签:

【中文标题】在我添加错误消息以检查 CapNum 是不是为空或已存在于数据库中之前,我的代码一直在工作【英文标题】:My code was working earlier until I added error messages for checking if CapNum is empty or already existed on the database在我添加错误消息以检查 CapNum 是否为空或已存在于数据库中之前,我的代码一直在工作 【发布时间】:2018-01-19 11:08:08 【问题描述】:
Dim cmd As mysqlCommand
cmd = con.CreateCommand
con.Open()
Try
    If String.IsNullOrEmpty(capNum.Text.ToString()) Then
        MessageBox.Show("Please fill up the Capstone Number to proceed.")
    Else
        Dim theQuery As String = "select * from listofcapstone where caps_Number like '%" & capNum.Text & "%'"
        Dim cmd1 As MySqlCommand = New MySqlCommand(theQuery, con)
        Dim reader As MySqlDataReader = cmd1.ExecuteReader()
        If reader.HasRows Then
            reader.Close()
            MessageBox.Show("There's already an existing data with this Capstone Number!")
        Else
            cmd.CommandText = "insert into listofcapstone(caps_Number, thesis_Title, ictdu_entNumber, year, course)values(@caps_Number, @thesis_Title, @ictdu_entNumber, @year, @course)"
            cmd.Parameters.AddWithValue("@caps_Number", capNum.Text)
            cmd.Parameters.AddWithValue("@thesis_Title", title.Text)
            cmd.Parameters.AddWithValue("@ictdu_entNumber", ictduCapNum.Text)
            cmd.Parameters.AddWithValue("@year", yr.Text)
            cmd.Parameters.AddWithValue("@course", course.Text)
            cmd.ExecuteNonQuery()
            MessageBox.Show("SUCCESSFULLY ADDED!")
            capNum.Clear()
            title.Clear()
            ictduCapNum.Clear()
            course.Clear()
            yr.SelectedIndex = -1
        End If
    End If
Catch ex As Exception
    MessageBox.Show("Connection Lost!!")
    Me.Close()
End Try
con.Close()

【问题讨论】:

它现在在做什么?不要让我们悬念!始终提供对问题的完整和清晰的解释。错误消息总是相关的。与预期不同的实际行为总是相关的。另外,你调试过代码吗?如果您还没有设置断点并单步执行代码、检查相关变量和其他表达式,那么现在在这里发布还为时过早。如果您不知道该怎么做,那么现在是学习的好时机。 我已经发现了问题......在
 If reader.HasRows Then reader.Close() MessageBox.Show("There's already a existing data with this Capstone Number!") Else cmd. CommandText = "insert into listofcapstone(caps_Number, thesis_Title, ictdu_entNumber, year, course)values(......
                
              
                
                        
            
如果您已经解决了自己的问题,您应该添加一个描述您所做的事情的答案,然后接受它。它可能会帮助遇到类似问题的其他人,并且可能会导致我们中的一个人指出更好的解决方案。 对此我很抱歉..我是这种领域的新手,只是注意到这个网站..我真的很想改进,所以我尝试了这个网站..谢谢先生建议和帮助 IMO:我建议将代码分成两个子部分:一个处理 UI(capNum.Text 检查等)并调用一个例程插入数据库,当你拥有所有代码时混在一起,以后很难维护。 【参考方案1】:

我建议您使用parameterized queries,而不是像使用SELECT 语句那样连接您的查询,以减轻SQL Injection 攻击。您可以阅读this 和this 了解更多信息。

您还可以使用Using 语句来处理已实现IDisposable 接口的任何对象,例如MySqlConnectionMySqlCommand 对象。来自documentation:

有时您的代码需要非托管资源,例如文件 句柄、COM 包装器或 SQL 连接。 A 使用块保证 当你的代码完成时处理一个或多个这样的资源 跟他们。这使得它们可供其他代码使用。

您还可以将检索记录和插入新记录的查询分解为单独的子例程。我整理了一个基本示例来展示我所讨论的内容:

Imports System
Imports System.Data
Imports MySql.Data
Imports MySql.Data.MySqlClient

Namespace MySqlCmdExample
    Class Program
        Private Shared Sub Main(args As String())
            Dim dataProvider As New AlbumDataProvider()

            Try
                If dataProvider.AlbumExists("Album_Five") Then
                    Console.WriteLine("Album exists...")

                    Return
                End If

                Console.WriteLine("Adding new album...")
                dataProvider.AddAlbum(3, "Album_Five")
            Catch ex As MySqlException
                Console.WriteLine([String].Format("Oops, an error occurred: 0", ex.Message))
            End Try
        End Sub
    End Class

    Public Class AlbumDataProvider
        Private connectionString As String = "server=localhost;user=<your_username>;database=stack_overflow;port=3306;password=<your_password>"

        Public Sub New()
        End Sub

        Public Function AlbumExists(name As String) As Boolean
            Dim found As Boolean = False

            Using conn As New MySqlConnection(connectionString)
                If conn.State = ConnectionState.Closed Then
                    conn.Open()
                End If

                Dim cmd As New MySqlCommand("SELECT * FROM Album WHERE `Name` = @albumName", conn)
                cmd.Parameters.AddWithValue("@albumName", name)

                Using reader As MySqlDataReader = cmd.ExecuteReader()
                    found = reader.HasRows
                End Using
            End Using

            Return found
        End Function

        Public Sub AddAlbum(ownerId As Integer, name As String)
            Using conn As New MySqlConnection(connectionString)
                If conn.State = ConnectionState.Closed Then
                    conn.Open()
                End If

                Dim cmd As New MySqlCommand("INSERT INTO Album(OwnerId, Name) VALUES(@ownerId, @albumName)", conn)
                cmd.Parameters.AddWithValue("@ownerId", ownerId)
                cmd.Parameters.AddWithValue("@albumName", name)

                cmd.ExecuteNonQuery()
            End Using
        End Sub
    End Class
End Namespace

【讨论】:

非常感谢您的建议先生:D 我明白您关于连接 sql 字符串的观点。我会记下它.. @Brzak 没问题。【参考方案2】:

我在我的代码中发现了问题..我尝试删除 try and catch 以查看代码的哪一部分未正确使用并收到“MySqlException was unhandled”错误消息..然后将阅读器放在其他部分

Dim theQuery As String = "select * from listofcapstone where caps_Number like '%" & capNum.Text & "%'"
Dim cmd1 As MySqlCommand = New MySqlCommand(theQuery, con)
Dim reader As MySqlDataReader = cmd1.ExecuteReader()
If reader.HasRows Then
    reader.Close()
    MessageBox.Show("There's already an existing data with this Capstone Number!")
Else
    reader.Close() 'Where I put the reader.'
    cmd.CommandText = "insert into listofcapstone(caps_Number, thesis_Title, ictdu_entNumber, year, course)values(@caps_Number, @thesis_Title, @ictdu_entNumber, @year, @course)"
    cmd.Parameters.AddWithValue("@caps_Number", capNum.Text)
    cmd.Parameters.AddWithValue("@thesis_Title", title.Text)

【讨论】:

以上是关于在我添加错误消息以检查 CapNum 是不是为空或已存在于数据库中之前,我的代码一直在工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中检查 NSArray 是不是为空或为空?

检查 gRPC 流何时为空或不是流式传输数据

如何检查数据读取器是不是为空或为空

检查所有三列是不是不为空或为空

检查字符串是不是为空或为空的最简单方法

在 XSLT 中检查字符串是不是为空或空