2017-04-21 27 views
0

我有一個VB.Net項目,我想在我的MSQL數據庫中保存確切的日期時間。但我無法抓住時間和日期。如何在MySQL中保存確切的日期時間

預期的行爲:在DB 2012年12月3日1時03分23秒

當前的行爲:在DB 2012年12月3日00:00:00

代碼段下面:

Dim temp = System.DateTime.Now 
Code(temp) 

Public Sub Code(ByVal dte As DateTime) 
    Dim strSQl As String = String.Format("Update tblTenant Set dte = '{0}' blablalbla", dte) 
    Me._Inst.execSQL(strSQl) 
End Sub 

EDIT在DB中的列類型是DATETIME

+0

什麼是列類型? –

+2

這是瘋狂的容易受到SQL注入攻擊。 –

+1

使用SQL參數將'DateTime'作爲'DateTime'傳遞。該代碼傳遞文本並讓DB提供者解決問題。 – Plutonix

回答

1

我不確定您的execSQL()方法是如何構建的,但將可變數據直接替換爲SQL查詢字符串並不正常,或者完全可以。這是讓你的程序被黑客攻擊的好方法。相反,您需要一種機制來分別接受數據並將其發送到服務器。這通常看起來是這樣的:

Public Sub execSQL(ByVal SQL As String, Optional ByVal ParamArray QueryParameters() As MySqlParameter) 
    Using cn As New MySqlConnection("connection string here"), _ 
      cmd As New MySqlCommand(SQL, cn) 

     If QueryParameters IsNot Nothing Then 
      For Each p As MySqlParameter In QueryParameters 
       'This does NOT EVER do string manipulation to set the data into the query 
       ' Instead, it's sent to the server in a separate data section, where the variables are setup. 
       ' In this way, data stays separate from code, and any possibility of sql injection is prevented. 
       cmd.Parameters.Add(p) 
      Next 
     End If 
     cn.Open() 
     cmd.ExecuteNonQuery() 
    End Using 
End Sub 

然後調用它像這樣:

Public Sub Code(ByVal dte As DateTime) 
    Dim strSQl As String = "Update tblTenant Set dte = @dte blablalbla" 
    Dim dteParam As New MySqlParameter("@dte", MySqlDbType.DateTime) 
    dteParam.Value = dte 
    Me._Inst.execSQL(strSQl, dteParam) 
End Sub 

我見過很多情況下,切換到查詢參數也是固定的一個棘手的格式或語法問題,所以我相信在這裏使用查詢參數很可能會解決引發問題的問題。

+0

您是否建議OP在查詢中沒有時間地惡意注入日期? – djv

+0

我瞭解sql注入方面,但嚴重的是,有參數化查詢比字符串更好地保存日期​​+時間的情況嗎? – djv

+0

@djv我見過很多情況下切換到參數固定一些奇怪的格式問題,如服務器運行與意外的區域設置。參數通常也更快,而且它們只是處理這種情況的正確方法。 –

-1

您的sql列類型是date(您說不是)或者您沒有將完整日期和時間傳遞給查詢。

仔細檢查sql列的類型。

然後使用中間字符串調試您的Code方法以保存日期時間。檢查它是否有時間。

Public Sub Code(ByVal dte As DateTime) 
    Dim dateString = dte.ToString("MM-dd-yyyy hh:mm:ss") 
    Dim strSQl As String = String.Format("Update tblTenant Set dte = '{0}' blablalbla", dateString) 
End Sub 

enter image description here

現在,如果你在數據庫中正確的類型,查詢其實

更新tblTenant設置DTE = '04 -21-2017 11:04 :41'blablalbla

但你仍然沒有看到數據庫中的時間,你有不同的問題。

+0

我們是否需要在日期時間內放置單引號? – Unbreakable

+0

@堅不可摧當然。最好的辦法是在發送到服務器之前查看最終的查詢字符串。更好的是,如果可以的話,在SSMS中執行該查詢。 – djv

相關問題