在我添加错误消息以检查 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
接口的任何对象,例如MySqlConnection
和MySqlCommand
对象。来自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 是不是为空或已存在于数据库中之前,我的代码一直在工作的主要内容,如果未能解决你的问题,请参考以下文章