質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C#

    7451questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1920questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Oracle

    613questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

  • .NET Framework

    480questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • Oracle Database 11g

    197questions

    Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

【VC#】【Oracle】該当するレコードが1行以上あるかどうかの判定について

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,112

KentaYanagida

score 40

お世話になります。

当方VC#初心者で、Oracleと連携したアプリケーションを開発したいと現在学習をしております。

「SELECT結果が1行以上あれば音声を再生する」という処理を行いたいのですが、
「SELECT結果が1行以上あれば」の処理はどのように行うのが定石でしょうか。
(ストアドで処理文を格納する、C#上でSQLを記述する、など)

可能であれば学習に役立つWebサイトやサンプルコードも拝見させていただきたいです。

SELECT文は以下で考えております。
SELECT 1 AS "SWITCH"
  FROM hoge
HAVING hoge.fuga = 999
 GROUP BY hoge.fuga;

使用環境:
Oracle 11g
Visual Studio 2010 Professional

以上、よろしくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

私もやるとしたらShinpeiYamamotoさんの1つ目のSELECT COUNT(*)を使います。

LINQ to Entitiesについてちょろっと。
LINQ to EntitiesとはEntity FrameworkというORMへのアクセスを提供します。
Entity FrameworkはDBをあまり意識せず、データの操作を簡単に行えます。

しかし、私は実際に使ってみた時に感じた癖や動作の重さからあまりおすすめはしません。
.NET向けのORMには他にもLightSpeedや、ORMの一部機能を実現し軽快に動作するMicroORMと呼ばれるものがあります。
私はMicroORMのDapperを使っています。
これはStackOverflowのエンジニアが作成したもので、とても軽快に動作し、SQLの結果をdynamicで返したり、オブジェクトにマッピングしてくれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/07 19:45

    回答ありがとうございます。

    [こちら](http://www.slideshare.net/kiyokura/adonetormmicro-orm-dapper-dot-net)を参照してDapperを導入いたします。
    恥ずかしながらNuGetも存じ上げませんでした…

    余裕があれば他のORMに手を出して、違いのわかるエンジニアになりたいと思います。笑

    キャンセル

  • 2014/12/07 19:53

    NuGetからの導入も簡単でいいですが、ソースは1ファイルなのでGitHubからコードを入手してプロジェクトに追加してしまうのもありです。
    ソースを見ること自体が勉強になりますし、意図した動作をしない場合のデバッグやちょこっと弄りたいときにやりやすいです。

    キャンセル

  • 2014/12/07 20:53

    ご指摘ありがとうございます。
    貼って頂いたGitHubからコードを入手することにします。
    (SqlMapper.csでいい…んですよね?)

    キャンセル

  • 2014/12/08 10:20

    .NETのバージョン次第になります。
    4.0までであればSqlMapper.cs
    4.5であればSqlMapperAsync.cs
    まだ使ったことはありませんがSqlMapperAsyncからは非同期な問い合わせがサポートされたようですね。

    キャンセル

  • 2014/12/08 12:03

    承知いたしました。SqlMapper.csを使用いたします。
    ご丁寧にありがとうございます。

    キャンセル

+2

OracleDBはよく知らないのですが、MySQLであれば以下のようなSQLを用いています。

SELECT 1 FROM hoge WHERE hoge.huga = 999 LIMIT 1

count(*)してしまうと全件検索になってしまうので、見つかった時点で打ち切るためにLIMIT 1を加えています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/08 12:00

    回答ありがとうございます。

    OracleにはLIMIT句が無いためROWNUM句を使いますが、
    ShinpeiYamamotoさんの二つ目のSQLがほぼ同様かと思います。

    今回の処理ではパフォーマンスに大きな差が無いため、
    COUNT(*)を使用することに致します。

    参照先に結合が伴う必要がある場合は取り入れさせて頂きます。

    キャンセル

+1

SELECT COUNT(*)
  FROM hoge
WHERE hoge.fuga = 999
SELECT ROWNUM 
FROM 
(
  SELECT 
  FROM hoge
  WHERE hoge.fuga = 999
)
WHERE ROWNUM = 1
私がやるとしたら上記のような感じですかね。
1つ目のは結果に1以上が返ってくれば音声を流す。
2つ目はレコードが返ってくれば音声を流す。

お話のような要件であれば普通は一つ目だろうと思います。
あとは、C#だったらLINQ to Entitiesとか使う方が一般的なのかな。実務でこれまでに見たソースではあんまり記憶がないのですけど。苦笑
私ならそうする、といったところでしょうか。

@IT ADO.NET Entity Framework入門

参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/07 19:18

    回答ありがとうございます。

    一つ目のSQLを使わせて頂きます。
    こちらの方が断然スマートですよね。

    LINQ to Entitiesですね。
    LINQという言葉だけは認識していたのですが、避けてしまっておりました。
    貼って頂いたリンク先で学習したいと思います。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7451questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1920questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Oracle

    613questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

  • .NET Framework

    480questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • Oracle Database 11g

    197questions

    Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。