提问人:Nnek Lecxe 提问时间:10/18/2023 更新时间:10/18/2023 访问量:57
vb.net 如何从数据库加载当前月份或任何特定月份
vb.net how to load current month or any specific month from database
问:
我是数据库编程的新手,所以我可以以任何方式寻求提示或帮助来加载我的数据库,我想在当前月份或我想要的任何特定月份加载数据库的地方,如果我有 2 个或更多“where”语句,它还会运行吗在我的 mysql命令?任何答案将不胜感激,谢谢。
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = DateTime.Now.Month.ToString
Try
conn.Open()
Dim cmd As New MySqlCommand("select * from tblchecklist where checkdate = '" & DateTime.Now.Month & " and check_number = '" & Label1.Text & "", conn)
dr = cmd.ExecuteReader
While dr.Read
DataGridView1.Rows.Add(dr.Item("ID"), dr.Item("check_corporate"), dr.Item("check_date"), dr.Item("check_num"), dr.Item("check_name"), dr.Item("check_memo"), dr.Item("check_amount"), dr.Item("check_group"), dr.Item("date_deposit"), dr.Item("date_release"), dr.Item("status"))
End While
dr.Dispose()
Catch ex As Exception
MsgBox(ex.Message)
End Try
conn.Close()
End Sub
答:
1赞
djv
10/18/2023
#1
使用 MONTH 函数
Dim cmd As New MySqlCommand(
" select * from tblchecklist " &
" where MONTH(checkdate) = " & DateTime.Now.Month &
" and check_number = '" & Label1.Text & "'", conn)
我只是在回答你的问题。但你也应该
- 参数化查询
- 在后台线程上运行查询,而不是在 UI 线程上运行查询
- 处置 IDisposable 对象
- 为控件命名
- 不使用 ,而是明确选择您需要的内容
SELECT *
评论
0赞
Joel Coehoorn
10/18/2023
对不起:仍然允许 sql 注入的答案是我自动投的反对票,即使它们有效。
0赞
djv
10/18/2023
@JoelCoehoorn不用担心
0赞
Nnek Lecxe
10/18/2023
您的代码现在非常适合我。顺便说一句,对不起菜鸟的问题。后台线程查询和UI线程查询有什么区别。一直试图从数据库 mysql 开始,对参数化查询没有太多想法,等等......背景信息将对我启动或提示会更好,提供示例基本代码将不胜感激。
0赞
djv
10/18/2023
@NnekLecxe 有趣的是,当 Form2 加载时,Label1.Text 已经填充了校验号。我有一种感觉,你正在将程序的状态存储在UI上,如果是这样,那也是另一个问题 - 可能比我提到的其他所有问题都大。
1赞
djv
10/19/2023
@NnekLecxe同步查询数据库时,线程的执行将暂停,直到查询完成。这就是使用后台线程(不是 UI 线程)的原因。在UI上运行时,您的表单将停止。这会导致应用程序运行缓慢。有几种方法可以在不同的线程上运行查询,例如 或 ,另一种方法是使用System.Threading.Thread
System.ComponentModel.BackgroundWorker
Async ... Await
2赞
Joel Coehoorn
10/18/2023
#2
这改善了一些事情:
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = DateTime.Now.Month.ToString
Try
'Do NOT try to re-use the same connection object throughout your app or form
'Thanks to connection pooling, it really is better to create (and immediately dispose)
' a new object for every query
Dim cn As New MySqlConnection("connection string here")
'Do NOT use string concatenation to put values into an SQL query!
Dim cmd As New MySqlCommand("select * from tblchecklist where checkdate = @Month and checkNumber = @CheckNum", cn)
cmd.Parameters.AddWithValue("@Month", DateTime.Now.Month)
cmd.Parameters.AddWithValue("@CheckNum", Label1.Text)
cn.Open()
'Rather than looping through results, you can often assign the query result object as a data source
DataGridView1.DataSource = cmd.ExecuteReader()
Catch ex As Exception
MsgBox(ex.Message)
' Use a Finally (or Using) block to close/dispose your connection object
Finally
cn.Dispose()
End Try
End Sub
但这仍然是错误的。该属性只是一个整数。听起来您希望查询显示整个月的任何内容。Month
在这种情况下,最佳选项如下所示:
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = DateTime.Now.Month.ToString
Dim SQL As String = "
SELECT ID, check_corporate, check_date, check_num, check_name, check_memo,
check_amount, check_group, date_deposit, date_release, status
FROM tblchecklist
WHERE checkdate >= @MonthStart AND checkdate < DATE_ADD(@MonthStart, INTERVAL 1 MONTH)
AND checkNumber = @CheckNum"
Try
Dim cn As New MySqlConnection("connection string here")
Dim cmd As New MySqlCommand(SQL, cn)
cmd.Parameters.AddWithValue("@MonthStart", New DateTime(DateTime.Today.Year, DateTime.Today.Month, 1))
cmd.Parameters.AddWithValue("@CheckNum", Label1.Text)
cn.Open()
DataGridView1.DataSource = cmd.ExecuteReader()
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Dispose()
End Try
End Sub
这里最大的变化是计算日期范围。这比检查每行中列的月份值要好得多,因为您只需要执行一次,而不是对表中的每个值执行一次,并且因为它仍然可以处理表中的索引。
我还想直接解决这个问题:
如果我的 mysqlcommand 中有 2 个或更多“where”语句,它还会运行吗?
不。你只得到一个子句。但是,该子句可以有任意数量的布尔条件(谓词)通过 和 运算符连接,并且只要用户提供的任何文本使用查询参数,就可以使用字符串连接来动态构建此子句。WHERE
AND
OR
评论
0赞
Nnek Lecxe
10/18/2023
还有一件事,“new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1))”是什么意思?“1”代表什么?而且,如果我想加载一个月,比如说 1 月、2 月等怎么办。我似乎不明白如何调整这部分
0赞
Nnek Lecxe
10/18/2023
非常感谢您的示例代码,为我提供了参数概述。非常感谢
1赞
Joel Coehoorn
10/18/2023
该表达式正在为月初构建一个新值......“月开始”。因此,我们根据当前日期提供年份和月份,然后是使用哪一天。New DateTime()
1
评论
WHERE
WHERE
Using
SqlConnection
SqlCommand