2014-02-13 223 views
0

我將客戶端信息插入到VB.Net 2010的MySql數據庫中的客戶端表中。問題是當它插入日期值時,MySql日期列顯示:「0000-00-00」。保存日期和時間從VB.Net到MySQL數據庫日期?

我需要做什麼才能將兼容的日期格式插入MysQl數據庫?

這是我試圖做到這一點的代碼:要插入DateTimePicker1.MinDate而不是用戶選擇的實際值

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 
+1

請使用參數化查詢....當然重寫後,ExecSQL – Steve

回答

2

此外,使用大寫個月,否則這些都是幾分鐘mm

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

最後,使用SQL參數,而不是字符串連接來防止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 
+0

謝謝,我是初學者請幫助我如何做到這一點? – ensberiyu

+0

@ensberiyu:我已經添加了一個例子。我認爲'clid'實際上是數據庫中的'int'。始終使用正確的類型。因此我使用了'Int32.Parse'。你可以使用'Int32.TryParse'來驗證輸入。 –

0

我有這樣的問題,以及和我解決它通過指定的ToString(「S」)我所有的DateTime變量

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

通過寫這樣在插入MySQL時,日期的格式是正確的(2006-08-22T06:30:07)。

+0

當我使用Msgbox檢查(yyyy/mm/dd)的位置時:它顯示(dd/mm/yyyy)。我認爲日期格式的位置沒有改變。問題是什麼? – ensberiyu

0

可能是零日期的問題是由於您讀取了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 

正如你所看到的,命令文本是現在更具可讀性和有沒有更多的字符串連接嵌入單引號。

0

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

DateTimePickerCustomFormat屬性只更改組件顯示在表格上的方式,DateTimePicker的實際日期值存儲在其Value屬性:

DateTimePicker1.Value 

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

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

在MySQL中 「日期」 數據類型存儲僅限日期,並以格式「2017-03-20」接受日期,因此我們在ToString函數中使用格式「yyyy-M-d」。