2017-04-21 2 views
0

Ich habe ein VB.Net-Projekt, und ich möchte genaue Datum Zeit in meinem MSQL DB speichern. Aber ich kann die Zeit nicht zusammen mit dem Datum erfassen.So speichern Sie genaue Datum Zeit in MySQL

erwartetes Verhalten: In DB 12-03-2012 01:03:23

Aktuelles Verhalten: In DB 12-03-2012 00:00:00

Code Snippet Unten:

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 der Spaltentyp in DB ist DATETIME-

+0

Was ist der Säulentyp? –

+2

Dies ist verrückt anfällig für SQL-Injektionen. –

+1

Übergeben Sie die DateTime als DateTime mit SQL-Parametern. Dieser Code übergibt Text und lässt den DB-Provider die Dinge abarbeiten. – Plutonix

Antwort

1

Ich bin mir nicht sicher, wie Ihre execSQL() Methode aufgebaut ist, aber es ist nicht normal oder überhaupt in Ordnung, variable Daten direkt in eine SQL-Abfragezeichenfolge zu ersetzen. Das ist ein guter Weg, um Ihr Programm zu hacken. Stattdessen benötigen Sie einen Mechanismus, um die Daten zu akzeptieren und separat an den Server zu senden. Das sieht oft so etwas wie dieses:

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 

und dann rufen Sie es wie folgt aus:

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 

Ich habe viele Fälle gesehen, wo Schaltparameter abfragen auch eine ärgerliche Formatierung oder Syntax Problem behoben , genug, so glaube ich, dass die Verwendung von Abfrageparametern sehr wahrscheinlich das Problem lösen wird, das Ihre Frage ausgelöst hat.

+0

Schlägst du vor, dass OP ein Datum ohne Zeit in die Abfrage injiziert? – djv

+0

Ich verstehe die SQL-Injektion Aspekt, aber ernsthaft, gibt es einen Fall, in dem eine parametrisierte Abfrage Datum + Zeit besser als eine Zeichenfolge? – djv

+0

@djv Ich habe viele Fälle gesehen, in denen der Wechsel zu Parametern einige seltsame Formatierungsprobleme behebt, wie zum Beispiel der Server, der mit einem unerwarteten Gebietsschema läuft. Parameter sind in der Regel auch schneller, und sie sind nur der richtige Weg, um mit dieser Situation umzugehen. –

-1

Entweder ist Ihr SQL-Spaltentyp date (Sie sagen, es ist nicht) oder Sie geben nicht das vollständige Datum und die Uhrzeit an die Abfrage.

Überprüfen Sie den sql-Spaltentyp.

Dann debuggen Sie Ihre Code Methode mit einem Zwischenstring, um die Datetime zu halten. Stellen Sie sicher, dass es Zeit hat.

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

Nun, wenn Sie die richtige Art in der Datenbank haben und Ihre Frage ist in der Tat

aktualisieren tblTenant Set dte = '04 -21-2017 11.04 : 41 'blablalbla

aber Sie sehen immer noch nicht die Zeit in der Datenbank, Sie haben ein anderes Problem.

+0

müssen wir auch einfache Anführungszeichen für das Datum eingeben? – Unbreakable

+0

@ Unbreakable natürlich. Am besten sehen Sie sich die letzte Abfragezeichenfolge an, bevor sie an den Server gesendet wird. Noch besser, führen Sie diese Abfrage in SSMS aus, wenn Sie können. – djv

Verwandte Themen