トップ回答者
日付の書き込み

質問
-
お世話になります。vb2008です。
これまではSQLServerに日付を書き込む処理をデータテーブルを使用して
newrecord.regist_date = Now
と書いて問題なく処理してました。
今回直接SQL文で書き込もうと下記の方法で書いてみていますが、日付を正確に書き込めません。
command.CommandText = "UPDATE article_management SET receipt_date = " & txtHiduke.Text & " WHERE ID = " & bango
command.ExecuteNonQuery()txtHiduke.Textに 2009/05/28 とすると 1900/01/15 というデータを書き込んでます。
2009/05/28 0:00:00 とやってみると書き込み処理自体がエラーになります。receipt_dateはdatetime型です。txtHiduke.Textは確認のために使用しているだけで、コードだけで今日の日付を書き込みたいのですが。
よろしくお願いします。
のぐちみずき
回答
-
command.CommandText = "UPDATE article_management SET receipt_date = " & txtHiduke.Text & " WHERE ID = " & bango
このようなクエリを実行するのは止めましょう。
SQLインジェクションの良い餌食にしかなりません。
"UPDATE article_management SET receipt_date = @hiduke WHERE ID = @bango"
として、
@付きのパラメータは、SqlParameterを引き渡してあげるように変更しましょう。
@hidukeをDataTime型できちんと設定すれば問題なく動作すると思います。
すべての返信
-
command.CommandText = "UPDATE article_management SET receipt_date = " & txtHiduke.Text & " WHERE ID = " & bango
このようなクエリを実行するのは止めましょう。
SQLインジェクションの良い餌食にしかなりません。
"UPDATE article_management SET receipt_date = @hiduke WHERE ID = @bango"
として、
@付きのパラメータは、SqlParameterを引き渡してあげるように変更しましょう。
@hidukeをDataTime型できちんと設定すれば問題なく動作すると思います。 -
SQLインジェクションの原因になることはGX999さんのご指摘どおりです。
txtHiduke.Textに 2009/05/28 とすると 1900/01/15 というデータを書き込んでます。
2009/05/28 = 14.35 と計算し、14.35で更新しにいくからです。ちなみに0は1900/01/01であり、それプラス14.35日になりますから、1900/01/15になります。(正確には1900/01/15 08:23:59.997)
2009/05/28 0:00:00 とやってみると書き込み処理自体がエラーになります。
2009/05/28と0:00:00の間に空白があるため、SQL文として成り立たないからです。
上記いずれも日付を「'」でくくることにより解決されます。つまり、'2009/05/28'、および'2009/05/28 0:00:00'です。
しかし、SQLインジェクションの原因になりますから、このようにSQL文を組み立てるのはやめましょう。くどいですが重要なことですので繰り返します。
また、SQL Server2008をお使いでしたら、日付だけを扱えるDate型がありますので、そちらの方が良いでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/