- PR -

「今日」だけ表示ができない

投稿者投稿内容
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-03 15:30
お世話になります。
MSSQLとVS2005 C#で次のようなプログラムを作りました。

----------------------------------------
protected void getDB(DateTime MemTemp)
{
string DateTemp = MemTemp.ToString("2004/MM/dd 0:00:00");
MemTemp = DateTime.Parse(DateTemp);

strSelectCommand = string.Empty;
strSelectCommand += "SELECT タイトル,コメント FROM 情報 WHERE 日付=";
strSelectCommand += "'" + MemTemp + "'";

SqlDataSource1.SelectCommand = strSelectCommand;
SqlDataSource1.DataBind();
SqlDataSource1.Dispose();

}

//関数の呼び出し
datToday = new DateTime();
datToday = DateTime.Now;

getDB(datToday);
----------------------------------------

DateTime型の日付をgetDBに渡すと、強引に年が2004年に、時間が0:00:00に入れ替わって、データベースから同じ日付のものをひっぱってくるという単純な仕組みです。ところがこれを実行すると、他の日付では問題なくDBのデータを表示できるのですが、「今日」のデータだけができません。


Page_Loadで呼び出すところでの、最初の1回だけは正常に表示されるのですが、一旦別の日のデータを呼び出したあとで、再び今日の日付を入れても、今日のデータを呼び出しません。試しにそのPage_Loadで呼び出すところのサブルーチンをコメントアウトしたところ、最初の一回はもちろん表示されませんでしたが、その場合は他の日のデータを呼び出したあとでも、今日の日付を与えれば正常にデータを拾ってきました。

しかも!
一度だけなぜか、そのPage_Loadのところをコメントアウトしなくても、「今日」のデータが表示できたことがあったのです。それなのに、そのサブルーチンの関数名だけを変えて他のところで呼び出してみたところ、やっぱり同じように今日だけが表示できなくなっていました。なのでその関数名を元に戻しましたが、やっぱり今日だけが表示できなくなっていました……。

こんな超常現象が起きているのですが、まず何から切り分けしていけば良いでしょうか……。ご助言よろしくお願いいたします。

_________________
■■■ 社内SEを兼務する文系プログラマーです。
■■■ WinXP VisualStudio2005(C#メイン)で使っています。
■■■ 四方がバカの壁で遮られた密室に監禁されています(´・ω・)

[ メッセージ編集済み 編集者: Wingard 編集日時 2006-10-03 15:32 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-03 16:04
getDBの中でブレークポイントいれて、MemTempにどういうデータが渡ってきているのか、
とか、DateTempにはどういうデータが含まれているか、とうを細かくみていったら
どうでしょうか。

引数として渡されるMemTempにもう一度データを書き込んでるのは気分的には
ちょっと嫌だな。。。
あれ、MemTempを文字列連結してちゃんとデータひろってこれます???
これ本当に動いてるのかなぁ。。。
strSelectCommandが最終的にどうなっているかまで一行ずつデータの状態を
みていったほうがいいかもしれませんね。


Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-03 16:25
ご回答ありがとうございます。

DateTempにもMemTempにも、想定したとおりの形で、(今日なら 2004/10/03 0:00:00 という形で)
データが入っていました。

MemTempも念のため別の変数を用意してみましたが、現象変わらず……。

また、strSelectCommandもちゃんとSELECT文の形になっています。
ここらへんは、別の日のデータを入力したときに
正常にデータを返してきていますので、問題ないかとおもうのですが……。

念のため「今日」と「別の日」のstrSelectCommandの内容を書いておきます。
----------------------------------------
SELECT タイトル,コメント FROM 情報 WHERE 日付='2004/10/03 0:00:00'
SELECT タイトル,コメント FROM 情報 WHERE 日付='2004/04/03 0:00:00'
----------------------------------------


ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-10-03 16:29
引用:

どっとねっとふぁんさんの書き込み (2006-10-03 16:04) より:

引数として渡されるMemTempにもう一度データを書き込んでるのは気分的には
ちょっと嫌だな。。。
あれ、MemTempを文字列連結してちゃんとデータひろってこれます???
これ本当に動いてるのかなぁ。。。


ちょっと吹いた(失礼)

DateTemp に日付を文字列にしたものを作成して、それを Parse するなら

DateTime DateTemp = new DateTemp(2004, MemTemp.Year, MemTemp.Month, 0, 0, 0);

でいいんじゃないかとか、strSelectCommand に MemTemp を渡している
けど、.ToString() してないねとか、そもそもシングルクォートで囲んでいるから
日付フィールドの型はもしかして文字列なのかしら?とか、SqlDataSource1
に DataBind してから Dispose してるのはなぜかしらとか、私もどっとねっと
ふぁんさんと同じく「これ本当に動いてるのかなぁ」という疑問がわいてきます。

一行ずつデータを見ていくというどっとねっとふぁんさんの意見に賛成ではありま
すが、直感的に SqlDataSource1.Dispose(); がちょっと気になります。
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-03 16:36
>ぽぴ王子
DateTime DateTemp = new DateTemp(2004, MemTemp.Year, MemTemp.Month, 0, 0, 0);
ってすごくスマートな感じでステキです。早速使ってみます。

>ToString() してないねとか
確かに変ですね……今までできていたのでここは気にしてませんでした……。

>Dispose
これは最初つけていなくても動いていたのですが、色々疑っているうちに付けていました……。
DateBindしたらDisposeはしなくてもいいのでしょうか?

Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-03 16:46
だめでした(つД`)・。
DateTime DateTemp = new DateTime(2004, MemTemp.Month, MemTemp.Day, 0, 0, 0);
にして、
Disposeを消して、
ToString()を付けてみましたが、現象変わらずでした……。


やっぱり「Page_Load」で最初のロードするときに呼び出すのが怪しい気がします……。隠していたわけではないのですが、SqlDataSource2というものも実はありまして、こちらはPage_Loadでは呼び出さないためか、正常な動作をしているように見えます。
具体的なことはやっぱりよくわかりませんが、ページの読み込み時に変なことが起こるようなことはありませんか?


[ メッセージ編集済み 編集者: Wingard 編集日時 2006-10-03 16:52 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-03 16:51
あとは入っているデータですよね。
'2004/10/03 12:50:00'
とかだったら引っかからないだろうし。とりあえず直接SQL投げてみて引っかかりますか?
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-03 16:54
>べるさん
ご回答ありがとうございます。
SQLデータは、最初に書いたとおり、

datToday = new DateTime();
datToday = DateTime.Now;

getDB(datToday);

で現在時刻も含めたデータを投げても最初の1回は正常に表示されていますので、
問題ないかと思います。

お手数ですが、引き続きご回答よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)