vb.net 如何从数据库加载当前月份或任何特定月份

vb.net how to load current month or any specific month from database

提问人:Nnek Lecxe 提问时间:10/18/2023 更新时间:10/18/2023 访问量:57

问:

我是数据库编程的新手,所以我可以以任何方式寻求提示或帮助来加载我的数据库,我想在当前月份或我想要的任何特定月份加载数据库的地方,如果我有 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
.net vb.net

评论

0赞 HardCode 10/18/2023
1. 你不是在问加载你的数据库,你是在问从你的数据库中读取。2. 查询中不能有多个子句,但子句中可以有一个或多个条件。3. 在 VB.NET 中搜索语句的使用,以查找一次性对象,例如 、.4. 在查询中搜索使用参数。WHEREWHEREUsingSqlConnectionSqlCommand
0赞 HardCode 10/18/2023
你在这里真的没有问题。尝试准确阐明您希望代码执行的操作,识别并发布未执行的操作,并包含任何错误消息(如果适用)。
0赞 J.Salas 10/18/2023
这个问题更多的是关于SQL而不是 vb.net。但是你需要阅读有关参数化查询的信息,你构建查询的方式是一个 SQL 注入糖果
0赞 Nnek Lecxe 10/18/2023
无论如何,使用我当前的代码,它似乎没有显示数据库中的数据,其中日期=当前月份记录

答:

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.ThreadSystem.ComponentModel.BackgroundWorkerAsync ... 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”语句,它还会运行吗?

不。你只得到一个子句。但是,该子句可以有任意数量的布尔条件(谓词)通过 和 运算符连接,并且只要用户提供的任何文本使用查询参数,就可以使用字符串连接来动态构建此子句。WHEREANDOR

评论

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