我将客户端信息插入到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
答案 0 :(得分:2)
您正在插入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
答案 1 :(得分:1)
简而言之,您需要DateTimePicker1.value.tostring("yyyy-M-d")
。
CustomFormat
DateTimePicker
属性仅更改组件在表单上的显示方式,DateTimePicker
的实际日期值存储在其Value
属性中:
DateTimePicker1.Value
要更改日期的格式,您只需使用ToString(format as string)
方法:
DateTimePicker1.Value.ToString("yyyy-M-d")
在MySQL中," 日期"数据类型仅存储日期,并接受格式为" 2017-03-20"因此我们使用格式" yyyy-M-d"在ToString
函数中。
答案 2 :(得分:0)
我也有这样的问题,我通过将ToString(“s”)指定给我所有的DateTime变量来解决它
dtb.ToString('s')
dtr.ToString('s')
通过这种方式编写插入MySQL时,日期格式正确(2006-08-22T06:30:07)。
答案 3 :(得分:0)
零日期的问题可能是因为您读取了DateTimePicker的错误属性(MinDate而不是Value),但是这里有一个很大的问题。
如果使用字符串连接来形成Sql命令,那么您编写的代码非常弱。首先,您对Sql注入开放,第二,您不能确定您的输入值正确格式化为数据库引擎,如果您的用户在字符串字段中键入单引号,则可能出现第三次解析错误。
要解决所有这些问题,需要重写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
正如您所看到的,命令文本现在更具可读性,并且不再有嵌入单引号的字符串连接。