我的应用程序中有一个datetimepicker,最终用户将用它来选择何时推迟项目。
如果用户选择日期并点击确认,则应将日期放入此条目的mysql记录中,但我似乎无法让VB更新DATE值:(
我认为它可能是格式化的东西,但我不确定如何最好地克服这个问题。
他确认'确认'背后的代码。按钮。
Private Sub ConfirmDefer_Click(sender As Object, e As EventArgs) Handles ConfirmDefer.Click
Dim deferdate As Date = Format(nb_deferdatepicker.Value, "yyyy-MM-dd")
updatesql("newbusiness_dataset", "action_date", deferdate, "id='" & nb_prospectid.Text & "'")
nb_defer_schedule.Visible = False
nb_defer_schedule.Enabled = False
End Sub
' UpdateSQL' bit是我用来简化db更新的函数。 它的输出SQL命令如下:
UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001'
任何帮助表示赞赏!提前致谢
答案 0 :(得分:1)
输出SQL命令如下:
UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001'
您的功能更新方式可能不正确。 Ticks不是通用SQL变量分隔符。它们用于指示文本:因此您的方法是将Date
转换为字符串,并且可能与Id相同,通常为数字。同样,这段代码:
Dim deferdate As Date = Format(nb_deferdatepicker.Value, "yyyy-MM-dd")
使用Option Strict On
这将无法编译。 Format
是一个返回字符串的函数,但代码将结果赋给DateTime
var。没有理由尝试格式化DateTimePicker
值,因为它已经是日期,并且MySQL NET数据提供程序对象知道如何将.NET日期传递给数据库。
鉴于产生的SQL,我还怀疑你使用串联将字符串的位串在一起用于查询。这非常危险,可能会导致SQL injection次攻击。它也会在Charles D'Artagnan
或Pete's Plumbing
等名称上失败。
SQL参数阻止了这一点,允许您将类型化数据传递给数据提供程序,从而使SQL易于读取和维护。一般方法是这样的:
Dim rows As Int32
Dim SQL = "UPDATE Table_Name SET colA = @p1, colB = @p2, colC = @p3 WHERE Id = @p4"
Using dbcon As New MySqlConnection(connStr)
Using cmd As New MySqlCommand(SQL, dbcon)
cmd.Parameters.Add("@p1", MySqlDbType.String).Value = myFrm.TextBox1.Text
cmd.Parameters.Add("@p2", MySqlDbType.Int32).Value = intVar
cmd.Parameters.Add("@p3", MySqlDbType.DateTime).Value = DateTime.Now
' the where:
cmd.Parameters.Add("@p4", MySqlDbType.Int32).Value = intVarA
dbcon.Open()
rows = cmd.ExecuteNonQuery()
End Using
End Using
ExecuteNonQuery
将报告受影响的行数,rows
会捕获该结果。魔法,就像它一样,在这里:
cmd.Parameters.Add("@p3", MySqlDbType.Date).Value = datetimeVar
使用参数可以传递实际的DateTime
变量而不是文本。您可以使用myDateTimePicker.Value
,因为值 是DateTime
。
Date
列,使用MySqlDbType.Date
参数只会将Date部分传递给数据库。 MySqlDbType.DateTime
将保存数据库设置为接受的DateTime
部分。对于Id使用MySqlDbType.Int32
也是如此:您可以传递正确的数据类型,而不是转换为字符串。