【问题标题】:Saving Date&Time from VB.Net to mysql Database Date?将日期时间从 VB.Net 保存到 mysql 数据库日期?
【发布时间】:2014-02-13 14:40:52
【问题描述】:

我正在将客户信息插入到 VB.Net 2010 的 MySql 数据库中找到的 Clients 表中。问题是当它插入 Date 值时,MySql Date 列显示:“0000-00-00”。

如何将兼容的日期格式插入 MysQl 数据库?

这是我尝试这样做的代码:

Dim dtb, dtr As DateTime
DateTimePicker1.Format = DateTimePickerFormat.Custom
        DateTimePicker1.CustomFormat = "yyyy-mm-dd"
        dtb = DateTimePicker1.MinDate
        txtdtb.AppendText(dtb)

        DateTimePicker2.Format = DateTimePickerFormat.Custom
        DateTimePicker2.CustomFormat = "yyyy-mm-dd"
        dtr = DateTimePicker1.MinDate

            ExecSQL("INSERT INTO clients VALUES('" & clid.Text & "','" & clname.Text & "','" & clgen.Text & "','" & dtb & "','" & claddress.Text & "','" & clemail.Text & "','" & clphone.Text & "','" & clocp.Text & "','" & dtr & "')")
            MsgBox("Record Saved", MsgBoxStyle.Information, "Save")

            FillList(frmMember.lvMember, GetData("SELECT * FROM clients"))

        End If

【问题讨论】:

  • 请使用参数化查询......当然是在重写那个 ExecSQL 之后

标签: mysql vb.net


【解决方案1】:

您插入的是DateTimePicker1.MinDate,而不是用户选择的实际值。

另外,使用大写月份,否则这些是分钟mm

DateTimePicker1.CustomFormat = "yyyy-MM-dd"
DateTimePicker2.CustomFormat = "yyyy-MM-dd"

最后,使用 sql-parameters 代替字符串连接来防止 sql 注入和本地化或转换问题。

这是一个例子:

Using con As New MySqlConnection(My.Settings.ConnectionString)
    Using cmd = New MySqlCommand("INSERT INTO clients VALUES(@clid,@clname,@clgen,@dtb,@claddress,@clemail,@clphone,@clocp,@dtr)", con)
        cmd.Parameters.AddWithValue("@clid", Int32.Parse(clid.Text))
        ' .... '
        cmd.Parameters.AddWithValue("@dtr", dtr.Value)
        con.Open()
        Dim insertedClientCount = cmd.ExecuteNonQuery()
    End Using
End Using

【讨论】:

  • 谢谢,我是初学者请帮我看看怎么做?
  • @ensberiyu:我添加了一个示例。我假设clid 实际上是数据库中的int。始终使用正确的类型。因此我使用了Int32.Parse。您可以使用Int32.TryParse 来验证输入。
【解决方案2】:

总之你需要DateTimePicker1.value.tostring("yyyy-M-d")

DateTimePickerCustomFormat 属性只改变了组件在表单上的显示方式,DateTimePicker 的实际日期值存储在其Value 属性中:

DateTimePicker1.Value

要更改日期的格式,您可以使用ToString(format as string) 方法:

DateTimePicker1.Value.ToString("yyyy-M-d")

在 MySQL 中,“date”数据类型仅存储日期并接受格式为“2017-03-20”的日期,因此我们在ToString 函数中使用格式“yyyy-M-d” .

【讨论】:

  • 又好又简单(Y)
【解决方案3】:

我也遇到过类似的问题,我通过将 ToString("s") 指定给我的所有 DateTime 变量来解决它

dtb.ToString('s')
dtr.ToString('s')

通过这种方式,日期在插入 MySQL 时具有正确的格式 (2006-08-22T06:30:07)。

【讨论】:

  • 当我使用 Msgbox 检查 (yyyy/mm/dd) 的位置时:它显示 (dd/mm/yyyy)。我认为日期格式的位置没有改变。有什么问题?
【解决方案4】:

可能是零日期的问题是因为你读错了DateTimePicker的属性(MinDate而不是Value),但是你这里有个大问题。

如果你使用字符串连接来形成你的 Sql 命令,你正在编写一个非常弱的代码。首先,您对 Sql Injections 持开放态度,其次您不能确保将输入值正确格式化为数据库引擎之类的格式,并且如果您的用户在字符串字段中键入单引号,则可能会出现第三个解析错误。

要解决所有这些问题,需要重写 ExecSQL 以接收参数集合

举例

 Dim pms As List(Of MySqlParameter) = new List(Of MySqlParameter)()
 pms.Add(new MySqlParameter("@id",clid.Text) ' Convert.ToInt32(clid.Text) if this is numeric'
 .... and so on for the other parameters ....

 ExecSql("Insert into clients " & _
         "VALUES(@id,@name,@gen,@dtb,@addr,@email,@phone,@clop,@dtr)",pms)


 Public Sub ExecSQL(command As String, pms As List(Of MySqlParameter))
     .. open the connection with using
     Dim cmd = new MySqlCommand(command, connection)
     cmd.Parameters.AddRange(pms.ToArray())
     cmd.ExecuteNonQuery();
 End Sub

如您所见,命令文本现在更具可读性,并且不再有嵌入单引号的字符串连接。

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多