Sql Server Compactで画面から入力された検索条件を利用する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シャープ(昨日の者です)

Sql Server Compactで画面から入力された検索条件を利用する方法

#1

投稿記事 by シャープ(昨日の者です) » 12年前

お疲れ様でございます。シャープと申します。
昨日も質問させていただきましたが、現在Sql Server CompactをC#上で利用してデータ管理のプログラムを作成しております。
Sql Server Compactではストアドプロシージャが利用できないとのことなのですが、以下のようなことが可能な方法がございましたらご教授ください。
・画面には複数の検索条件(日付、名前など)を入力する箇所があり、日付が入力されていれば日付で検索、名前も入力されていれば名前と日付で検索、何も入力されていなければ条件なしですべてのデータを出力する

if文が使えないとのことなので、やはりこういった処理は不可能なのでしょうか?
お手数ですが今回もよろしくお願いいたします。

シャープ()

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#2

投稿記事 by シャープ() » 12年前

事前にstringなどで必要なクエリとなる文字列を作成しておいて、それを検索直前にクエリとして登録するようなことが出来ればよいのでしょうか?
そういったことは可能ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#3

投稿記事 by softya(ソフト屋) » 12年前

Sql Server CompactもC#でデータベースアプリを作ったこともないですが、データベースである以上条件の組み立てはプログラムで行うことで検索ができるはずです。
MSDNを読んでもわからないとか、調べきれないのなら、専用の本を買われたほうが良いかもしれませんね。
「SQL リファレンス (SQL Server Compact)」
http://technet.microsoft.com/ja-jp/libr ... 73372.aspx

と思ったら日本の書籍が無さそう?ですかね。ちょっと敷居が高いかもしれません。

【追記】
「Microsoft Visual C# と SQL Server Compact で日記アプリを作る(1) - 欲しいものリスト」
http://hoshii-mono.com/features/subcategory-16.php
↑ こちらで組み立ててているSQL文(SELECT うんちゃら)が検索で利用するものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

シャープ()

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#4

投稿記事 by シャープ() » 12年前

>>softyaさん
ご返信をありがとうございます。
今まさにそちらの日記アプリの記事を参考に作らせていただいておりまして、そちらの条件の作成の仕方だとおそらく「日付を空白にして検索」を行うことはできないのではないか?と思っておりました。
どこかの検索条件が空白である場合、if文が利用できれば該当箇所を除外することでクエリを正しく動作させることができますが、if文が使えないとなるとどうしていいものかわからず迷っております。(あと、whereが既に入力されているかどうかの確認もできないのではないかと…)

TableAdapterにクエリを追加できるメソッドなどあれば、クエリを実行直前に作成することも可能かと思ったのですが、それもなさそうだと感じました(調べ切れていないだけかもしれませんが)。
Compactという名称からして簡単に運用できるのかと思っておりましたが、機能が制限されてこのように基本的な動作も不可能になってしまっているのですね。
検索条件を複数ユーザから指定してもらうようなプログラムは作成できないということなのでしょうか…。

たった今考えたのですが、検索対象の列を「ID」、検索条件を「@SearchIDVal」(空白の場合もある)とすると、
where (ID=@SearchIDVal) or (@SearchIDVal="" and ID="%")
とするようなことが許されたりしますでしょうか?入力されているIDが存在するIDと一致する場合、もしくは検索条件としてIDが入力されていなければすべてのIDを抽出する…など。
変数と値を比較することはやはりできないでしょうか…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#5

投稿記事 by softya(ソフト屋) » 12年前

SQL文の組み立て次第で何とでもなります。ストアドプロシージャは関係ありません。
検索条件が空白であるならSQL文で検索条件にしなければ良いだけです。

キモは、このSQL文の組み立てです。

コード:

SELECT [date], [text] FROM [diary] WHERE (date >= @startdate) AND (date <= @enddate) ORDER BY date
これを理解しないと話にならないですよ。

兼用しようとするからややこしくなるのでは?
where (ID=@SearchIDVal) or (@SearchIDVal="" and ID="%")
空白の場合のSQL文と、指定する場合のSQL文の組み立てをC#のプログラムとして変えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

シャープ()

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#6

投稿記事 by シャープ() » 12年前

以下のSQLで、取り急ぎ実現したかったことについては実現できました。

コード:

SELECT ID, Name, Job, Time 
FROM TableA 
WHERE
( (Name LIKE '%' + @SearchName + '%') OR (Name LIKE '%' AND @SearchName = '') )
AND 
( (Job LIKE '%' + @SearchJob + '%') OR (Job LIKE '%' AND @SearchJob = ''))
>空白の場合のSQL文と、指定する場合のSQL文の組み立てをC#のプログラムとして変えて下さい。
 空白の場合とそうでない場合とで、条件に指定できる項目の個数分C#側のコードを書くということでしょうか。
 こちらについては最初に考えたのですが、できればこういった方法はとりたくないと考え、1つのSQLで実現する方法を考えておりました。
>検索条件が空白であるならSQL文で検索条件にしなければ良いだけです。
 検索条件にするかしないかを、検索条件が空白かどうかで(if文なしで)変更する方法がわからず、実現できませんでした。

C#のプログラムとして複数行書いたほうがいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#7

投稿記事 by softya(ソフト屋) » 12年前

> 空白の場合とそうでない場合とで、条件に指定できる項目の個数分C#側のコードを書くということでしょうか。
> こちらについては最初に考えたのですが、できればこういった方法はとりたくないと考え、1つのSQLで実現する方法を考えておりました。

最終的には、どの方法が分かりやすくメンテしやすいかです。
「こういった方法はとりたくない」などと言う不明確な理由でこだわるところでは無いはずです。
チャレンジしたいのなら、それはそれで構わないんです。
両方できた上で、こちらを使いたいと言う自己選択をするならですけど。

> 検索条件にするかしないかを、検索条件が空白かどうかで(if文なしで)変更する方法がわからず、実現できませんでした。

C#のif文を使いましょう。SQL文は入力側の項目をチェックするために有るのではありません。
データベースの検索に使うものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

シャープ()

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#8

投稿記事 by シャープ() » 12年前

>>softyaさん
ご返信ありがとうございます。
検索条件に合わせて複数行、複数クエリを作成しても問題はないということですか?
こういった場合は、一つのクエリにまとめなくてはいけないものと思っていました(これまで見てきたクエリがそうだったので)。
複数行・複数クエリを作成しても問題がないならよかったです。
そちらの方法を採用したいと思います。
ご教授まことにありがとうございました。これにてこちらのスレッドは解決とさせていただきます。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#9

投稿記事 by YuO » 12年前

解決となっていますが……。

テーブルアダプタに最初からクエリを用意しておくのは,そのクエリが確定している場合などには使えますが,検索条件が変わるようなときには向きません。
条件によってクエリを動的に生成し,SqlCeCommandを直接使って結果をDataSetに流し込めばよいと思いますが……。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#10

投稿記事 by softya(ソフト屋) » 12年前

YuO さんが書きました:解決となっていますが……。

テーブルアダプタに最初からクエリを用意しておくのは,そのクエリが確定している場合などには使えますが,検索条件が変わるようなときには向きません。
条件によってクエリを動的に生成し,SqlCeCommandを直接使って結果をDataSetに流し込めばよいと思いますが……。
C#やSql Serverでのお約束を全然知らないのでフォローして頂けると助かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

シャープ()

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#11

投稿記事 by シャープ() » 12年前

>>YuOさん
ご返信ありがとうございます。
先にクエリを作っておかなくても、あとでクエリを追加できるようなコマンドということでしょうか?
お恥ずかしながら提示してくださったものの理解がまだできていません。
引き続き調査を続行いたします。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: Sql Server Compactで画面から入力された検索条件を利用する方法

#12

投稿記事 by YuO » 12年前

シャープ() さんが書きました:先にクエリを作っておかなくても、あとでクエリを追加できるようなコマンドということでしょうか?
お恥ずかしながら提示してくださったものの理解がまだできていません。
まず,IDbCommand (SqlCommand, SqlCeCommand, etc.) を使えば,アドホッククエリを実行できます。
TableAdapterのSelectCommand等で使っているのも,実際にはIDbCommandです。

で,IDbCommandのExecuteReaderを使ってIDataReaderを得てそこから値を取得するのがADO.NETの基礎です。
通常はReadメソッドで一行ずつ読んでいくのですが,DataSetと兼用する場合にはDataTableのLoadメソッドで,IDataReaderを元にDataTableを埋めることができます。

Sql Server Compact 3.5付属のNorthwind.sdfから型付きDataSetを作成し,アドホッククエリでDBから型付きDataSetに流し込む例。

コード:

using System;
using System.Data;
using System.Data.SqlServerCe;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main ()
        {
            var adapter = new NorthwindDataSetTableAdapters.CustomersTableAdapter();
            NorthwindDataSet nds = new NorthwindDataSet();
            using (var connection = new SqlCeConnection(adapter.Connection.ConnectionString))
            {
                connection.Open();
                var command = new SqlCeCommand(@"SELECT * FROM [Customers] WHERE Address LIKE @addr", connection);
                command.Parameters.Add("@addr", SqlDbType.NVarChar, 60).Value = "%Hanover%";
                using (var reader = command.ExecuteReader())
                {
                    nds.Customers.Load(reader);
                }
            }

            foreach (var row in nds.Customers)
            {
                Console.WriteLine(row.Address);
            }
        }
    }
}

閉鎖

“C言語何でも質問掲示板” へ戻る