データベースのあいまい検索について質問です。
今月の日付のみ表示させたいのですがどうにもうまくいきません。
ご助力いただけましたら幸いです。
今月の日付を下記コードで取得します。
今月のみの表示にしたいので年と月のみ取得します。
Dim SearchText1 = Now.ToString(yyyy/M/)
下記コードであいまい検索を行おうとしているのですがどうも上手くいきません。
(SELECT 日時,予定 FROM db WHERE 日時 LIKE ' & SearchText1 & ', OleConn)
デバッグを開始するとエラーは出ませんが、
DataGridには何も表示されないという結果になってしまいます。
対象のデータベースがわからないのだけれど
SQL Server だった場合
DOSコマンドで「OSQL」によりSQLを実行できます
DIM を使っているところを見るとVBがわの問題なのか、
データベース側の問題か切り分けてから
質問したほうがよろしいのでは?
開発環境くらいは、提示しようよ
問題点によっては、質問している掲示板違うかもしれませんよね?
質問の仕方、おおざっぱ過ぎませんか、ここにはエスパーいませんよ
例えば、現在日時の表記が'2008/1/'だとして、
> 日時 LIKE '2008/1/'
の条件を指定したとしても無駄だと思います。(というか、LIKEの意味が無い)
使用しているDBのLIKEのワイルド文字について調べるのが良いかと。
後、日時フィールドがどのような型かは知りませんが、日付型(DBDateTime等)に
対しての文字列による検索は好ましくないかと思います。
日時に対してのBETWEEN~AND指定を調べてみてください。
# もう一点付け加えるなれば、パラメータクエリも・・・。
wood様、玲音様
お返事遅れまして申し訳ございません。
まずは、情報不足でご迷惑をおかけいたしました。
以下のような開発環境です。
OS:Windows XP pro
言語:Visual Studio 2003
DB:access
データベース内は
2008/12/29
2008/1/4
2008/1/12
・
・
・
と日付データが入っています。
dim SearchText1 = Now.ToString(yyyy/m/)
MessageBox.Show(SearchText1)
として実行してみた場合
きちんと表示されるので、
問題があるとしたらSQL文だと思います。
> 問題があるとしたらSQL文だと思います。
と思われるのであれば、先に書かれた
> SELECT 日時,予定 FROM db WHERE 日時 LIKE ' & SearchText1 & '
この部分のSQLをAccess上のクエリとして発行してあげることが必要ではないかと
思います。Access上でこのクエリ結果が自分の思っていた結果と異なるのであれば
プログラム上から同様のクエリを発行しても同じ結果でしょう。
> 使用しているDBのLIKEのワイルド文字について調べるのが良いかと。
この部分については調べられたでしょうか?
> dim SearchText1 = Now.ToString(yyyy/m/)
> MessageBox.Show(SearchText1)
SearchText1をそのままクエリに乗せても日付を限定しないワイルド検索は行われませ
ん。
> SearchText1 = SearchText1 & %
のように変更しなければならないかと思われます。
玲音様
返信ありがとうございます。
>> 使用しているDBのLIKEのワイルド文字について調べるのが良いかと。
> この部分については調べられたでしょうか?
この部分につきましては調べました。
*をつけないとワイルドになりませんね
基本的なことでしたorz
Dim SearchText1 = Now.ToString(yyyy/MM/)
SearchText1 = SearchText1 & *
DataGrid1.RowHeadersVisible = False
Dim OleConn As OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim OleDA As OleDb.OleDbDataAdapter
Dim dtSet As DataSet = New DataSet(PRODUCTS)
OleConn.ConnectionString = _
provider=microsoft.jet.oledb.4.0; & _
data source=scheduler.mdb; & _
persist security info=false
OleDA = New OleDb.OleDbDataAdapter(SELECT * FROM db WHERE 日時 LIKE
' & SearchText1 & ', OleConn)
OleDA.Fill(dtSet, Products)
DataGrid1.DataSource = dtSet.Tables(0)
上記のようにしたところ、エラーは表示されませんでしたが、
DataGridにも何も表示されませんでした。
yyyy/MM/にはきちんと値が入っていることは確認済みです。
C#の例ですけど
foreach (DataRow dr in dataTable.Rows)
{
//ヘッダ情報
if (Start_Count == 0)
{
Start_Count++;
for (CAP_IDX = 0; CAP_IDX < dr.ItemArray.Length; CAP_IDX++)
{
sw.Write(dataTable.Columns[CAP_IDX].Caption);
sw.Write(,);
}
sw.WriteLine( );
}
//データ情報
for (CAP_IDX = 0; CAP_IDX < dr.ItemArray.Length; CAP_IDX++)
{
sw.Write(dr[CAP_IDX]);
sw.Write(,);
}
sw.WriteLine( );
}
swは気にしないでください
要は「まぐろ さん」のDataGridへの値のセットの仕方に問題はないのか
と言うことです
カラムヘッダを取得してセットする
カラムヘッダに合わせてデータ部をセットすることが足りなくないですか?
提示したサンプルはCSVファイルに出力しているものです
キーワード
foreach (DataRow dr in dataTable.Rows)
dataTable.Columns[CAP_IDX].Caption
dr[CAP_IDX])
CAP_IDXは列インデックスなので気にしないで
それぞれVBではどう使えば良いのか調べてみてください
yyyy/MM/だからではないですか?
これって,2008/01/に展開されますよね。
で,データが
> 2008/1/4
> 2008/1/12
だって言っているんですから。
OleDbDataAdapterに渡すクエリをそのままAccessで実行して,クエリ側に問題がないこと
を確認してみてください。
wood様、YuO様
ご指摘ありがとうございます。
YuO様
> yyyy/MM/だからではないですか?
うっかりしていました。
Mをひとつにしても変わりありませんでした。
また、クエリ側に問題ないと確認できました。
SELECT * FROM db WHERE 日時 LIKE 2008/1/* ;
上記SQL文で一月の日付のみ表示されました。
wood様
コード例の記載ありがとうございます。
> 要は「まぐろ さん」のDataGridへの値のセットの仕方に問題はないのか
> と言うことです
とありましたので、こまめにデバッグしながら一から作り直してみました。
Dim SearchText1 = Now.ToString(yyyy/M/)
SearchText1 = SearchText1 & *
をコメントアウトし、
SQL文を(SELECT 日時,予定 FROM db , OleConn)したところ、
きちんと一覧表示されました。
しかし、以下SQL文では表示されませんでした。
(SELECT 日時,予定 FROM db WHERE 日時 = 2008/1/21, OleConn)
(SELECT 日時,予定 FROM db WHERE 日時 LIKE '2008/1/*', OleConn)
SQL文にWHEREをつけると表示されなくなるみたいです。
> また、クエリ側に問題ないと確認できました。
のクエリと,
> しかし、以下SQL文では表示されませんでした。
のクエリが異なっていますよ。
Accessは他のRDBと異なり,単引用符ではなく二重引用符で文字列を指定する,というこ
とはないですか。
手っ取り早さでいうと
WHERE format(日時,'yyyy/mm') = '2007/10' ;
ですが、件数が多いと遅くなるかもしれません。