ご相談します。
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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
.NET SqlDataReader のレコード有無判定
Visual Basic(VBA)
-
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
ワークテーブルの作成について
Visual Basic(VBA)
-
-
4
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
5
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
6
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
7
”パラメータ値を TextBox から String に変換できません
SQL Server
-
8
2台のサーバー間でのテーブル結合方法
SQL Server
-
9
関数内の変数に<summary>コメントを付けたい
C言語・C++・C#
-
10
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
11
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS2007 フォーム 「バリア...
-
SQL Date型の列から年月だけを...
-
【VB.NET】日付型の列にNULLを...
-
SQLサーバでの和暦(int)→西暦へ...
-
SQLサーバで和暦から西暦に変換...
-
ACCESSで3ファイルを結合して、...
-
サーバー破壊
-
Accessの重複なしのカウントの...
-
SQLのエラー(~付近に不適切な...
-
Visuaal Studio Community 2022...
-
<SQL>重複しているデータの場合...
-
SQLて何ですか!
-
AccessのInsertクエリのあとつ...
-
SQLServer2012、FOR XML PATH('...
-
sqlで、600行あるテーブルを100...
-
Windows 10 Home で、SQL Serve...
-
生え際から顎先まで17.5 頭頂か...
-
SQL文 複数実行
-
chr(13) と char(13) の違いっ...
-
Access2013で操作ログを残した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SqlDataReaderでの0件判定
-
bcpで抽出した結果をエクセルに...
-
Transact-SQLでテキストファイ...
-
本番環境で応答なし。。。
-
vbaのaccessconnectionについて
-
Oracle 8i コンマ(,)を含むデ...
-
SQLサーバー接続 特定のPCがWin...
-
SQLのエラー(~付近に不適切な...
-
GROUP BYでエラーが発生
-
Access2010 accdbのエラー「ODB...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
SQL Loaderを使いたい
-
NAT-KUのノートパソコンは?
-
エクセルマクロで指定範囲内の...
-
既定のインスタンスと名前付き...
-
PostgreSqlでFunctionの作成に...
-
SQL ServerにTCP/IPで接続出来ない
-
バッチファイルからのBCP起動に...
-
新規saの作成方法について
-
ノートンの解約(「ライセンス...
おすすめ情報
kmeeさん
お礼に書き漏らしましたので、こちらで補足します。
今回の対応、本来は、計算前に、NULLやcount数を確認するのでしょうが、
上記の確認を行わず、代わりに、Selectに「group by」を付けるというワークアラウンドもありという事ですね。