2017-04-21 16 views
0

私はVB.Netプロジェクトを持っており、私のMSQL DBに正確な日付時刻を保存したいと思います。しかし、私は日付と一緒に時間をキャプチャすることはできません。MySQLの正確な日付時刻を保存する方法

期待される動作:DBで2012年12月3日午前1時03分23秒

現在の行動:DB以下は、2012年12月3日午後12時〇〇分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メソッドを中間文字列でデバッグして、datetimeを保持します。その中に時間があることを確認してください。今

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

関連する問題