DOBON.NET DOBON.NETプログラミング掲示板過去ログ

日付の書式について

環境/言語:[WIN2000, SQLServer2000]
分類:[.NET]

いつもお世話になっております。

現在、VB.NETを使用してDB(SQLServer2000)に問い合わせる処理を作成しています。
そこで質問があります。

行いたい事
 AテーブルのAフィールド(日付型)にある日付の条件式を記述したい。
 条件としては、画面のテキストボックスの値(例、”05/04/01”と入力されている)
 を取得する。

問題点
 VB6.0で使用可能な参照設定を行わない仕様となっている。

 以前、別の言語(確かVBAだったはず)にて下記の様な条件式を記述したら
 日付の環境設定(コンパネの設定で変更可能となる箇所)に依存してしまい
 抽出条件が異なるエラー?が発生してしまいました。
 (このときはFormat文で強制的に書式を変換して対処)
 "WHERE A = '" & 画面の値 & "'"


VB.NETでも、書式を強制的に指定した方がよいでしょうか?VB.NETでもこのような
エラー(エラーではない)は、発生しますか?また、みなさんはどのように
記述されていますでしょうか?教えてください。
書式を指定した方がよいんでないでしょうか?
Dim dt As DateTime = DateValue(テキストボックス.text)
Dim strWhere as string = "WHERE A = " & dt.ToString(書式を指定)
とか?
これはSQL構文やDBエンジンの問題のような気がしますが、そういうことではなくて?
> 書式を指定した方がよいんでないでしょうか?

というか、もう一歩進んで・・・
フラットなStringだけのSQLを使わずに、Parametersコレクションを使って型指定ありの箱埋め式のSQLにした方が色々安全かと。
「'」つけたり「#」つけたり、何もつけなかったり、をプログラマが意識して切り替えるのは徒労です。

(SQLServerの場合、名前付パラメータが使えて便利ですし・・・。)
ライダー阿部さん、こど。さん、ご回答ありがとうございます。

返答が遅くなり申し訳ありませんでした。

> Dim dt As DateTime = DateValue(テキストボックス.text)
> Dim strWhere as string = "WHERE A = " & dt.ToString(書式を指定)
このような記述ができるとは、知りませんでした。String.Tostringで書式を
指定できるという事は、調べていて知っていたのですがこの方法だとVB6.0でいう
Format関数みたいな事はできないと思っていました。私の調査不足ですね。

> これはSQL構文やDBエンジンの問題のような気がしますが
やはり、言語の問題ではないんですかね?言語がもっているADO、DAO、ADODBと
いったデータプロバイダ(呼び名があっているか不安)の問題かと思っていたの
ですが。興味があるので調査してみます。知っている方がいれば教えてください。


> フラットなStringだけのSQLを使わずに、Parametersコレクションを使って型指定ありの箱埋め式のSQLにした方が色々安全かと。
> 「'」つけたり「#」つけたり、何もつけなかったり、をプログラマが意識して切り替えるのは徒労です。
>
> (SQLServerの場合、名前付パラメータが使えて便利ですし・・・。)
Parametersコレクション、名前付パラメータ、知らない事だらけですね。
VB6.0やVBA等の時は、関数を作成していました。例えば、SQLServerの
日付型の場合は関数SQLDateを呼ぶ。SQLDateは、「"'" & 引数 & "'"」
を返すという処理です。このような方法より、もっと便利な方法があると
いう事ですよね。明日、Parametersコレクション、名前付パラメータを
キーワードとして再調査をしてみます。結果をまた連絡します。
VB.NETは、色々な事ができるので楽しいですね。
こど。さん、調べた結果をお伝えします。間違っていたら、ご指摘ください。

>>フラットなStringだけのSQLを使わずに、Parametersコレクションを使って型指定ありの箱埋め式のSQLにした方が色々安全かと。
↑の事は、下記の様な記述方法の事を言われているのですよね。
(コネクション等の細かい所は省略してあります。)

insert into Aテーブル (Aフィールド) Values (@Hiduke)
cmd.Parameters.Add(New SqlParameter("@Date", SqlDbType.DateTime))
cmd.Parameters("@Date").Value = DateTime.Parse(txtDate.Text)

今回開発中の案件では、データベースにアクセスする処理はクラス化されていて
使用者は、SQLを投げる部分の記載しかできません。残念ですが、この方法は
今回は使用できません。しかし、こうゆう方法もあるという事がわかったのは
自分にプラスです。

今回は、ライダー阿部さんに教えて頂いた方法を関数化して対応したいと
思います。

また色々質問するかと思いますがよろしくお願いいたします。
こど。さん、ライダー阿部さんありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板