2016-02-19 81 views
1

我的應用程序中有一個datetimepicker,最終用戶將用它來選擇何時將項目推遲到。從datetimepicker獲取日期到mysql

如果用戶選擇一個日期,點擊確認,日期應該投進MySQL的記錄此項,但我不能似乎得到VB,以更新的日期值:(

我想它可能是格式化的東西,但我不知道如何最好地克服這一點。

He're的「確認」按鈕後面的代碼。

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」位的功能我用簡化db的更新。 其輸出SQL公司命令如下:

UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001' 

任何幫助表示讚賞!在此先感謝

+1

是在數據庫中的action_date'datetime'? – Hemal

+0

它的'日期',而不是'日期時間',因爲我根本不打擾時間,只是約會。 我也嘗試將其更改爲日期時間,以查看它是否有所作爲,但仍不更新記錄。 – John

+0

將其更改爲'yyyy-mm-dd' – Hemal

回答

1

輸出SQL命令如下:
UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001'

的方式你的函數是更新可能不正確。蜱不是通用的SQL變量分隔符。它們用於表示文本:所以你的方法是將Date轉換爲字符串,並且對於通常爲數字的Id可能是相同的。同樣,此代碼:

Dim deferdate As Date = Format(nb_deferdatepicker.Value, "yyyy-MM-dd") 

使用Option Strict On這將不會編譯。 Format是返回字符串的函數,但代碼將結果賦值給DateTime var。沒有理由嘗試格式化DateTimePicker值,因爲它已經是日期了,MySQL NET數據提供者對象知道如何將.NET日期傳遞給db。

鑑於生成的SQL,我還懷疑您正在使用串聯來將字符串的位粘合在一起進行查詢。這是非常危險並且可能導致SQL injection攻擊。它也會失敗,如Charles D'ArtagnanPete'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 
  • 的USING塊處置應該被設置的釋放資源的事情
  • 一個新的連接和命令對象的創建,使用和處理的。通常助手喜歡重用這些,但特別是對於DBCommand對象來說,它們沒有任何可重用性。
  • 由於ExecuteNonQuery會報告有多少行受到影響,rows會捕獲該結果。

的魔法,比如它,是在這裏:

cmd.Parameters.Add("@p3", MySqlDbType.Date).Value = datetimeVar 

使用參數,你可以通過一個實際DateTime變量,而不是文字。您可以使用myDateTimePicker.Value,因爲值 a DateTime

  • 對於Date列,使用MySqlDbType.Date該參數將只傳遞Date部分到數據庫。
  • MySqlDbType.DateTime將保存數據庫設置爲接受DateTime的任何部分。

對於Id使用MySqlDbType.Int32也是如此:不是轉換爲字符串,而是可以傳遞正確的數據類型。