ご相談します。
SqlDataReaderで「sum」を取得する際、0件の判定がうまくできません。
該当0件にも拘らず、読み込みが行えた時のステップが実行されてしまい、「System.InvalidCastException: '指定されたキャストは有効ではありません。'」が発生します。
しかし、「Select」文に「group by」を付けると、正しく、問題の該当ステップが回避されます。すでに、「where」句で対象レコードを絞り込んでいるため、「group by」をする必要はないため、「group by」は付けたくありません。
ネット検索しましたが、「group by」を付けなければならない話は見つけられませんでした。それとも、「sum」関数を使う場合の制約か何かがあるのでしょうか?
エラー発生:
String str_zan_Az = "select sum(UkeZan * Tnk * Rate / KeiQty) as AzKin_total from zan" +
" where ((ActNo = @ActNo_Az) and (Class = '00'))";
SqlCommand cmd_zan_Az = new SqlCommand(str_zan_Az, conn_JIP_HULFT_Dev);
SqlParameter parm_zan_Az = new SqlParameter("@ActNo_Az", SqlDbType.Char, 7);
cmd_zan_Az.Parameters.Add(parm_zan_Az);
cmd_zan_Az.Parameters["@ActNo_Az"].Value = reader_kyaku["ActNo"] as string;
using (SqlDataReader reader_zan_Az = cmd_zan_Az.ExecuteReader())
{
while (reader_zan_Az.Read() == true)
{
local_Azkin_total = local_Azkin_total + (decimal)reader_zan_Az["AzKin_total"]; <--- ここで、上記エラーが発生します
}
}
エラー発生しない:
String str_zan_Az = "select sum(UkeZan * Tnk * Rate / KeiQty) as AzKin_total from zan" +
" where ((ActNo = @ActNo_Az) and (Class = '00'))" +
" group by ActNo, Class"; <-- 「group by」を付けると、上記エラーが発生しません
SqlCommand cmd_zan_Az = new SqlCommand(str_zan_Az, conn_JIP_HULFT_Dev);
SqlParameter parm_zan_Az = new SqlParameter("@ActNo_Az", SqlDbType.Char, 7);
cmd_zan_Az.Parameters.Add(parm_zan_Az);
cmd_zan_Az.Parameters["@ActNo_Az"].Value = reader_kyaku["ActNo"] as string;
using (SqlDataReader reader_zan_Az = cmd_zan_Az.ExecuteReader())
{
while (reader_zan_Az.Read() == true)
{
local_Azkin_total = local_Azkin_total + (decimal)reader_zan_Az["AzKin_total"];
}
}
よろしくお願いします。
VisualStudio
Microsoft Visual Studio Professional 2017 (2)
Version 15.5.7
VisualStudio.15.Release/15.5.7+27130.2036
Microsoft .NET Framework
Version 4.7.03056
C#
Visual C# 2017 00370-20007-72734-AA238
Microsoft Visual C# 2017
SQL Server
Microsoft SQL Server Express (64-bit)
13.0.4206.0
Microsoft Windows NT 6.3 (17134)
PC
Microsoft Windows [Version 10.0.17134.165]
No.4ベストアンサー
- 回答日時:
SQL Server Management Studio はインストールしてありますか?
あるのなら、各SQLでどんな結果が返るか確認するのがいいかと。
groupの無い方は、whereで該当する0件の集計結果として、nullの行を返します。
ある方は、グループ毎に集計してwhereで該当するグループを返す(ように見える)ので、0行返します。
countで行数も数えて先に判定する、isnullで0にしてしまう、decimalにキャストするまえにnullかどうか確認する、などがかんがえられます。
ただ、手元で実行プランを確認したところ、groupの有無で、プランもパフォーマンスも違いはほとんどありませんでした。
kmeeさん
SQL Server Management Studioはインストールしてありましたので確認しました。(不慣れで、この様な使い方を思いつきませんでした)
「group by」しない方は、sum項目「MRF_total」が「NULL」にも拘らず、「(1行処理されました)」となっていました。このため、「while (reader_zan_MRF.Read() == true)」が成り立ってしまったと考えました。
それに対し、「group by」する方は、「(0行処理されました)」となるため、「while (reader_zan_MRF.Read() == true)」が成り立たなかったと考えました。
そして、『「group by」しない方は、1行処理され、NULL値が返されたが、
「group by」する方の「MRF_total」の空欄は、1行も処理されていない為、NULL値すら返されていない。』という事でしょうか?
丁寧な調査と優しい回答をありがとうございます。
大今
No.2
- 回答日時:
>(decimal)reader_zan_Az["AzKin_total"];
詳しく見てないけど、NULLが返っているとかじゃないですかね?
慎重にキャストする、何かが足りない気がする。
回答をありがとうございます。
はい、おそらく計算項目がNULLのために、エラーになっていると思います。
そのため、「while (reader_zan_Az.Read() == true)」の中に計算式を配置して、読み込めた時のみ計算しようとしているのですが、該当なしの時にも「while (reader_zan_Az.Read() == true)」の中に入ってきてしまいます。
ところが不思議なことに、「group by」を付けると、該当なしの時に「while (reader_zan_Az.Read() == true)」の中に入って来ません。(「該当なし」が正しく認識されているようです)
しかし、本来(この件を除いては)「group by」を付ける必要性はないと考えているため、出来れば、「group by」を付けたくないのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(悩み相談・人生相談) AZワゴン乗ってる女子ってダサいですか、、? 21歳です。。 7 2022/08/04 21:58
- 車検・修理・メンテナンス マツダAZワゴンMJ22の新品 フロントバンパーと リアバンパーは それぞれ新品で、いくら でしょう 2 2022/06/10 23:17
- 数学 至急、数学の問題について教えてください。 4 2022/09/11 07:26
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- 電子書籍 Androidタブレット→microSDカード→電子辞書AZ-SV4000経緯でシス単mp3音声デー 6 2023/04/03 20:37
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- 車検・修理・メンテナンス マツダAZワゴン 平成19年式 のATオイルは、どこから入れるの ですか? フロントの前に レベルゲ 5 2022/05/03 01:55
- 数学 次の問題についてご教授願いします。 3点z=0 , z=-1 , z=i をそれぞれω=0 , ω= 4 2023/05/23 20:13
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- 中古車 車詳しいかたおられましたお願いしたいです 最近中古車で車を買おうとおもってるのですが、 マツダ AZ 2 2023/02/27 00:45
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
.NET SqlDataReader のレコード有無判定
Visual Basic(VBA)
-
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
-
4
frxファイルの役目
Visual Basic(VBA)
-
5
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
6
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
7
2台のサーバー間でのテーブル結合方法
SQL Server
-
8
”パラメータ値を TextBox から String に変換できません
SQL Server
-
9
C# ログイン画面からメイン画面への画面遷移について
C言語・C++・C#
-
10
CellEnterイベント仕様について
Visual Basic(VBA)
-
11
【C#】DataGridViewの最大列数について
システム
-
12
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Transact-SQLでテキストファイ...
-
本番環境で応答なし。。。
-
SqlDataReaderでの0件判定
-
ノートパソコンのHDDを同機種へ...
-
Excel-VBAの「しばらくお待ちく...
-
SQLのエラー(~付近に不適切な...
-
Oracle 8i コンマ(,)を含むデ...
-
既定のインスタンスと名前付き...
-
NAT-KUのノートパソコンは?
-
単純な質問です
-
RDSデバイスCALを誤って消費し...
-
ノートンの解約(「ライセンス...
-
コールドスタンバイのライセンス
-
エクセルマクロで指定範囲内の...
-
SQLCMDにて教えていただきたい...
-
VBAからaccessへの接続で、Reco...
-
PostgreSqlでFunctionの作成に...
-
drop user できない。ORA-01940
-
SQL Server時間切れについて
-
ユーザー定義関数内でのsp_exec...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SqlDataReaderでの0件判定
-
bcpで抽出した結果をエクセルに...
-
Transact-SQLでテキストファイ...
-
テキスト取込からのデータ取込...
-
本番環境で応答なし。。。
-
SQL Server 2005 データベース...
-
Accessプロジェクト ストアド...
-
Oracle 8i コンマ(,)を含むデ...
-
SQLサーバー接続 特定のPCがWin...
-
SQLのエラー(~付近に不適切な...
-
PostgreSqlでFunctionの作成に...
-
Access2010 accdbのエラー「ODB...
-
既定のインスタンスと名前付き...
-
ノートンの解約(「ライセンス...
-
Excel-VBAの「しばらくお待ちく...
-
SQL Loaderを使いたい
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
GROUP BYでエラーが発生
-
エクセルマクロで指定範囲内の...
-
ユーザー定義関数内でのsp_exec...
おすすめ情報
kmeeさん
お礼に書き漏らしましたので、こちらで補足します。
今回の対応、本来は、計算前に、NULLやcount数を確認するのでしょうが、
上記の確認を行わず、代わりに、Selectに「group by」を付けるというワークアラウンドもありという事ですね。