C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: EXEファイルのSQL結果が開発環境と異なる


(過去ログ 163 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■94301 / inTopicNo.1)  EXEファイルのSQL結果が開発環境と異なる
  
□投稿者/ Kerorinikov (1回)-(2020/04/01(Wed) 10:59:37)

分類:[.NET 全般] 

少々嵌っているのでお知恵を貸して下さい。

VB.NETでプログラム開発を行っているのですが、とある画面で発行しているSQLの結果が開発環境で確認している時と
他のパソコンで実行したEXEファイルで変わってしまう現象が発生しています。

開発環境は以下の通りです。(少々古いです)

開発マシン:Windows10
開発Editior:Visual Studio2008
コンパイル時に使用される.NET Framework:3.5
使用DataBase:SQL Server2017
EXEファイル実行マシン:Windows10、Windows7


発行しているのは下記のようなSQLです。
-------------------------------------------------------
SELECT
T.商品コード,
SUM(M.売上数量) AS 売上数
FROM
売上テーブル T
LEFT JOIN
商品マスタ M
ON T.商品コード = M.商品コード
AND T.請求先コード = M.請求先コード
WHERE
T.売上日付 BETWEEN '20200323' AND '20200329'
AND
T.請求先コード IN ('111', '222', '333', '444')
AND
M.商品区分 IN ('1', '2')
GROUP BY
商品コード
--------------------------------------------------------

このSQLは、開発環境でデバッグしている時や Object Browser のようなSQL実行ツールで確認している時は
意図通りの値が取れていますが、コンパイルしたEXEファイルを他のパソコンで実行すると
結果が異なってしまいます。
デバッグログを仕込んで確認した所、発行しているSQLは完全一致していますが、RecordCount自体が異なります。
値としては、売上日付が'20200329'までの売上数量と同じでしたので、WHERE句の「'20200323'から」と言う
条件が無視されている印象です。

プログラム内では、SQLを SqlClient.SqlDataAdapter で実行し、DataTable に格納して値を取得しています。
過去ログ等から、各テーブルのカラムのデータ型も意識しているのですが解消されません。

そこで、開発マシンでもEXEファイルで実行してみた所、こちらはデバッグ時と同様の正しい結果が取得できました。
よって .NET Framework や依存ファイルのバージョンを疑って調べたのですが見ている限り差があるように思えません。


どなたか原因が分かる方はいらっしゃいますでしょうか?
引用返信 編集キー/
■94302 / inTopicNo.2)  Re[1]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ 魔界の仮面弁士 (2655回)-(2020/04/01(Wed) 11:40:19)
No94301 (Kerorinikov さん) に返信
> そこで、開発マシンでもEXEファイルで実行してみた所、こちらはデバッグ時と同様の正しい結果が取得できました。

「開発機では、VS からでも EXE からでも、その他ツールからでも期待動作」
「他のパソコン(Win7/Win10)では、想定と異なる動作」
ということでしょうか。

接続文字列に問題が無いのだとしたら、それぞれの PC のコントロールパネルで、
地域設定が西暦ではなく和暦モードになっていて、
'20200323' のはずが '020323' という文字列が生成されていたということは無いでしょうか。


> デバッグログを仕込んで確認した所、発行しているSQLは完全一致していますが、RecordCount自体が異なります。

SQL Server へ送出している SQL を追跡するのではなく、
SQL Server が受信している SQL を追跡してみるのはどうでしょう。

https://www.projectgroup.info/tips/SQLServer/MSSQL_00000008.html
https://www.projectgroup.info/tips/SQLServer/MSSQL_00000037.html
https://www.projectgroup.info/tips/SQLServer/MSSQL_00000042.html



> 過去ログ等から、各テーブルのカラムのデータ型も意識しているのですが解消されません。
> WHERE
> T.売上日付 BETWEEN '20200323' AND '20200329'

参考までに、売上日付のデータ型は何でしょうか?
引用返信 編集キー/
■94303 / inTopicNo.3)  Re[2]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ kaina (63回)-(2020/04/01(Wed) 12:03:58)
接続しているデータベースはデバッグ時とEXEで動かした時で
同じデータベースでしょうか?
もし、検証環境と本番環境で接続DBが別ということであれば、
テーブルの内容に差異はありませんか?

引用返信 編集キー/
■94306 / inTopicNo.4)  Re[3]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ Kerorinikov (3回)-(2020/04/01(Wed) 13:11:47)
No94303 (kaina さん) に返信
> 接続しているデータベースはデバッグ時とEXEで動かした時で
> 同じデータベースでしょうか?
> もし、検証環境と本番環境で接続DBが別ということであれば、
> テーブルの内容に差異はありませんか?
>

ご回答ありがとうございます。
はい。間違いなく同じデータベースを使用した結果です。接続DBに差異はありません。
引用返信 編集キー/
■94307 / inTopicNo.5)  Re[2]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ Kerorinikov (4回)-(2020/04/01(Wed) 13:17:29)
No94302 (魔界の仮面弁士 さん) に返信
> ■No94301 (Kerorinikov さん) に返信

ご返信ありがとうございます。

> 「開発機では、VS からでも EXE からでも、その他ツールからでも期待動作」
> 「他のパソコン(Win7/Win10)では、想定と異なる動作」
> ということでしょうか。

はい、こちらの認識で間違いありません。


> 接続文字列に問題が無いのだとしたら、それぞれの PC のコントロールパネルで、
> 地域設定が西暦ではなく和暦モードになっていて、
> '20200323' のはずが '020323' という文字列が生成されていたということは無いでしょうか。

こちらは意識しておりませんでした。
他にご指摘して頂いた内容と合わせて確認してみます。


> SQL Server へ送出している SQL を追跡するのではなく、
> SQL Server が受信している SQL を追跡してみるのはどうでしょう。
>
> https://www.projectgroup.info/tips/SQLServer/MSSQL_00000008.html
> https://www.projectgroup.info/tips/SQLServer/MSSQL_00000037.html
> https://www.projectgroup.info/tips/SQLServer/MSSQL_00000042.html

試してみます。結果は後ほどご報告します。


>>WHERE
>> T.売上日付 BETWEEN '20200323' AND '20200329'
>
> 参考までに、売上日付のデータ型は何でしょうか?
nvarchar(8) です。


取り急ぎ御礼とご報告まで。
引用返信 編集キー/
■94310 / inTopicNo.6)  Re[3]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ Kerorinikov (5回)-(2020/04/01(Wed) 14:10:47)
>> 接続文字列に問題が無いのだとしたら、それぞれの PC のコントロールパネルで、
>> 地域設定が西暦ではなく和暦モードになっていて、
>> '20200323' のはずが '020323' という文字列が生成されていたということは無いでしょうか。

>こちらは意識しておりませんでした。
>他にご指摘して頂いた内容と合わせて確認してみます。

こちらの指摘がビンゴでした。
地域設定は西暦でしたが、「短い日付」が開発機は「yyyy/mm/dd」、その他のマシンは「yy/mm/dd」でした。
揃えた所、結果が同じになったことが確認出来ました。

当方もこの業界に入って長いのですが、こちらの設定がこのように影響してくることは初めて体験しました。
今後も精進して参りたいと思います。

魔界の仮面弁士 さん、ありがとうございました。
kaina さんもお時間割いて下さいましてありがとうございました。
解決済み
引用返信 編集キー/
■94313 / inTopicNo.7)  Re[3]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ 魔界の仮面弁士 (2656回)-(2020/04/01(Wed) 14:17:57)
No94307 (Kerorinikov さん) に返信
>>>WHERE
>>> T.売上日付 BETWEEN '20200323' AND '20200329'
>>参考までに、売上日付のデータ型は何でしょうか?
> nvarchar(8) です。

nvarchar(8) ならば、文字列リテラルは UNICODE 接頭辞 N を付与した

 T.売上日付 BETWEEN N'20200323' AND N'20200329'

の形とするのが本来の指定かと思います。今回の直接の原因かどうかは別として。
(実際にはリテラルではなくパラメーター化されているのならば、パラメーターの型を確認)
引用返信 編集キー/
■94314 / inTopicNo.8)  Re[4]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ 魔界の仮面弁士 (2657回)-(2020/04/01(Wed) 14:25:52)
No94310 (Kerorinikov さん) に返信
> 地域設定は西暦でしたが、「短い日付」が開発機は「yyyy/mm/dd」、その他のマシンは「yy/mm/dd」でした。
> 揃えた所、結果が同じになったことが確認出来ました。

解決したようで何よりです。

このほか、地域設定が "yyyy-MM-dd" になっていた時に、
 String.Format("{0:yyyy/MM/dd}", Now) → "2020-04-01"
 String.Format("{0:yyyy\/MM\/dd}", Now) → "2020/04/01"
になるという点も注意事項です。

数値書式も地域設定依存の書式がありえるのですが、
日本語環境においては経験上、日付書式のトラブルの方が多いですね。



Label や ListView 等に『表示する』際に、コントロール パネルの地域設定が使われるのは OK ですが、
入出力やデータ形式が、コントロール パネルの設定に依存するのは、都合が悪いかと思います。

そのためプログラムで扱う場合は、String.Format に CultureInfo を毎回明示するか、
あるいは CurrentCulture にニュートラルカルチャにセットしておくなどして、
地域設定によらず、常に一定の内容が得られるようにします。
解決済み
引用返信 編集キー/
■94316 / inTopicNo.9)  Re[5]: EXEファイルのSQL結果が開発環境と異なる
□投稿者/ Kerorinikov (6回)-(2020/04/01(Wed) 15:23:19)
2020/04/01(Wed) 16:27:19 編集(投稿者)

No94314 (魔界の仮面弁士 さん) に返信
> ■No94310 (Kerorinikov さん) に返信
>>地域設定は西暦でしたが、「短い日付」が開発機は「yyyy/mm/dd」、その他のマシンは「yy/mm/dd」でした。
>>揃えた所、結果が同じになったことが確認出来ました。
>
> 解決したようで何よりです。
>
> このほか、地域設定が "yyyy-MM-dd" になっていた時に、
>  String.Format("{0:yyyy/MM/dd}", Now) → "2020-04-01"
>  String.Format("{0:yyyy\/MM\/dd}", Now) → "2020/04/01"
> になるという点も注意事項です。
>
> 数値書式も地域設定依存の書式がありえるのですが、
> 日本語環境においては経験上、日付書式のトラブルの方が多いですね。
>
>
>
> Label や ListView 等に『表示する』際に、コントロール パネルの地域設定が使われるのは OK ですが、
> 入出力やデータ形式が、コントロール パネルの設定に依存するのは、都合が悪いかと思います。
>
> そのためプログラムで扱う場合は、String.Format に CultureInfo を毎回明示するか、
> あるいは CurrentCulture にニュートラルカルチャにセットしておくなどして、
> 地域設定によらず、常に一定の内容が得られるようにします。

追加のアドバイスありがとうございます。
文字列リテラルのお話含め、大変参考になりました。こちらの設定は是非実践していきたいと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -