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

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

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

Re[8]: Decimalフィールドの取得


(過去ログ 83 を表示中)

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

■49026 / inTopicNo.1)  Decimalフィールドの取得
  
□投稿者/ らーじ (6回)-(2010/04/20(Tue) 16:22:14)

分類:[VB.NET/VB2005 以降] 

サブクエリにてDecimalフィールドの値を取得すると0Dとなってしまいます。
Decimalフィールド取得には何か必要でしょうか?

コードは以下の通りです。

よろしくお願い致します。

Dim Cmd As New OleDb.OleDbCommand
Dim Da As New OleDb.OleDbDataAdapter(Cmd)
Dim TanaTbl As New DataTable

With TanaTbl.Columns
.Add("ID", GetType(Integer))
.Add("HIN_PRICE", GetType(Decimal))
End With

Cmd.Connection = Cn
Cmd.CommandText = "SELECT ID, " & _
                  "(SELECT HIN_PRICE FROM HINMASTER WHERE HIN_CODE = TANATBL.HIN_CODE) AS HIN_PRICE " & _
                  "FROM TANATBL"

Da.Fill(TanaTbl)

DataGridView1.DataSource = TanaTbl

引用返信 編集キー/
■49029 / inTopicNo.2)  Re[1]: Decimalフィールドの取得
□投稿者/ 魔界の仮面弁士 (1630回)-(2010/04/20(Tue) 17:30:20)
No49026 (らーじ さん) に返信
> サブクエリにてDecimalフィールドの値を取得すると0Dとなってしまいます。
つまり、数値 0 ですね。末尾の D は、それが Decimal 型の数値である事を示しています。


> Decimalフィールド取得には何か必要でしょうか?
質問は、取得した数値が意図した値ではないという事でしょうか?
だとしたら、取得元のデータがそもそも 0 だったという事はありませんか?

それとも、0D という表記法が都合が悪いという事でしょうか?
であれば、書式を指定すれば良いかと。


> よろしくお願い致します。
「0Dとなってしまう」という『状況』は分かりましたが、
それをどのようにしたいのかという点が記されていなかったので、
何について答えて欲しいのかが今ひとつ伝わってきません…。
引用返信 編集キー/
■49030 / inTopicNo.3)  Re[2]: Decimalフィールドの取得
□投稿者/ らーじ (7回)-(2010/04/20(Tue) 17:33:27)
No49029 (魔界の仮面弁士 さん) に返信
> ■No49026 (らーじ さん) に返信
>>サブクエリにてDecimalフィールドの値を取得すると0Dとなってしまいます。
> つまり、数値 0 ですね。末尾の D は、それが Decimal 型の数値である事を示しています。
>
>
>>Decimalフィールド取得には何か必要でしょうか?
> 質問は、取得した数値が意図した値ではないという事でしょうか?
> だとしたら、取得元のデータがそもそも 0 だったという事はありませんか?
>
> それとも、0D という表記法が都合が悪いという事でしょうか?
> であれば、書式を指定すれば良いかと。
>
>
>>よろしくお願い致します。
> 「0Dとなってしまう」という『状況』は分かりましたが、
> それをどのようにしたいのかという点が記されていなかったので、
> 何について答えて欲しいのかが今ひとつ伝わってきません…。

申し訳ないです。

取得した値が意図した値でないため、正確な値を得るにはどのようにしたら良いかお伺いした次第です。

取得元のデータは0もありますが、ほとんどが0ではありません。(取得したデータの該当フィールドはすべてが0Dとなっている。)

引用返信 編集キー/
■49031 / inTopicNo.4)  Re[3]: Decimalフィールドの取得
□投稿者/ 魔界の仮面弁士 (1631回)-(2010/04/20(Tue) 18:36:30)
2010/04/20(Tue) 18:37:28 編集(投稿者)

No49030 (らーじ さん) に返信
> 取得した値が意図した値でないため、正確な値を得るにはどのようにしたら良いかお伺いした次第です。
LEFT JOIN 構文に切り替えてみては如何でしょう。


> コードは以下の通りです。
データベースは何でしょうか?
こちらで試してみた限り、0 となるパターンは再現できませんでした。
(ただし、別の問題が発生しましたが…)


> 取得元のデータは0もありますが、ほとんどが0ではありません。
下記のようなデータを用意して試してみました。


CREATE TABLE HINMASTER ( HIN_CODE NUMERIC(2) PRIMARY KEY );
INSERT INTO HINMASTER VALUES ( 10 );
INSERT INTO HINMASTER VALUES ( 20 );
INSERT INTO HINMASTER VALUES ( 30 );

CREATE TABLE TANATBL ( ID NUMERIC(1) PRIMARY KEY, HIN_CODE NUMERIC(2), HIN_PRICE NUMERIC(3) );
INSERT INTO TANATBL VALUES ( 1, 10, 110 );
INSERT INTO TANATBL VALUES ( 2, 10, 210 );
INSERT INTO TANATBL VALUES ( 3, 20, 320 );
INSERT INTO TANATBL VALUES ( 4, 30, 420 );
INSERT INTO TANATBL VALUES ( 5, 40, 540 );

SELECT ID,
(SELECT HIN_PRICE FROM HINMASTER WHERE HIN_CODE = TANATBL.HIN_CODE) AS HIN_PRICE
FROM TANATBL


上記を、Access MDB に対して実行したところ
 1 1
 2 2
 3 3
 4 4
 5 (null)
という妙な結果となりました。

ただし DAO 3.6 で接続した場合や、Access 2007 のクエリ画面では、
SQL Server と同じ結果が得られました。

さらに何回か繰り返していると、稀にサブクエリの列から
 137.819369692441947535507567
といった謎の結果が得られたり、実行時エラーが発生する事もありました。



一方、同じ内容を SQL Server 2005 に対して実行したところ、こちらは期待通りに
 1 110
 2 210
 3 320
 4 420
 5 (null)
という結果を得ることができました。

また、テーブル定義を NUMERIC → NUMBER に変更した上で、
Oracle 10g に対して試した場合も、問題なく表示されました。


≪期待通りの結果となった組み合わせ≫
・Provider=SQLOLEDB + System.Data.OleDb
・Provider=SQLOLEDB + ADODB
・System.Data.SqlClient
・Provider=OraOLEDB.Oracle + System.Data.OleDb
・Provider=OraOLEDB.Oracle + ADODB
・Provider=MSDAORA + System.Data.OleDb
・Provider=MSDAORA + ADODB
・DAO 3.6
・Microsoft Access 2007 クエリ画面


≪期待と異なる結果となった組み合わせ≫
・Provider=Microsoft.JET.OLEDB.4.0 + System.Data.OleDb
・Provider=Microsoft.JET.OLEDB.4.0 + ADODB
・Provider=Microsoft.ACE.OLEDB.12.0 + System.Data.OleDb
・Provider=Microsoft.ACE.OLEDB.12.0 + ADODB
引用返信 編集キー/
■49033 / inTopicNo.5)  Re[4]: Decimalフィールドの取得
□投稿者/ 魔界の仮面弁士 (1632回)-(2010/04/20(Tue) 19:04:55)
No49031 (魔界の仮面弁士) に追記
> CREATE TABLE HINMASTER ( HIN_CODE NUMERIC(2) PRIMARY KEY );
> CREATE TABLE TANATBL ( ID NUMERIC(1) PRIMARY KEY, HIN_CODE NUMERIC(2), HIN_PRICE NUMERIC(3) );

ん…。適当にテーブルを生成してしまったけれども、HIN_PRICE は HINMASTER 側のフィールドかな?

# まぁ、仕様を勝手に想像していっても意味が無いので、追加回答はしばし保留。。。
引用返信 編集キー/
■49034 / inTopicNo.6)  Re[5]: Decimalフィールドの取得
□投稿者/ らーじ (8回)-(2010/04/20(Tue) 19:16:57)
No49033 (魔界の仮面弁士 さん) に返信
> ■No49031 (魔界の仮面弁士) に追記
>>CREATE TABLE HINMASTER ( HIN_CODE NUMERIC(2) PRIMARY KEY );
>>CREATE TABLE TANATBL ( ID NUMERIC(1) PRIMARY KEY, HIN_CODE NUMERIC(2), HIN_PRICE NUMERIC(3) );
>
> ん…。適当にテーブルを生成してしまったけれども、HIN_PRICE は HINMASTER 側のフィールドかな?
>
> # まぁ、仕様を勝手に想像していっても意味が無いので、追加回答はしばし保留。。。

MDBです。OLEDBでSELECTしています。

HIN_PRICEはHINMASTERのフィールドです。
引用返信 編集キー/
■49040 / inTopicNo.7)  Re[6]: Decimalフィールドの取得
□投稿者/ よねKEN (480回)-(2010/04/20(Tue) 22:53:09)
> HIN_PRICEはHINMASTERのフィールドです。

魔界の仮面弁士さんの No49031 の投稿の内容をベースにHIN_PRICEをHINMASTERに持たせた内容で実験してみました。
私の環境でも、同様に以下のような結果になりました。
(Windows 7 64bit環境。64bit環境ではJETは使えないようなのでコンパイルオプションでAnyCPU→x86に変えて確認)

・Microsoft Access 2007 クエリ画面
 1 110
 2 210
 3 320
 4 420
 5 (null)

・Provider=Microsoft.JET.OLEDB.4.0 + System.Data.OleDb
 1 1
 2 2
 3 3
 4 4
 5 (null)

ちなみに、VisualStudio上からクエリデザイナで実行した場合も(中身はたぶんMicrosoft.JET.OLEDB.4.0なので)
 1 1
 2 2
 3 3
 4 4
 5 (null)

という結果になりました。ついでに実験としてクエリデザイナ上で、

SELECT ID,
(SELECT HIN_PRICE FROM HINMASTER WHERE HIN_CODE = TANATBL.HIN_CODE) AS HIN_PRICE
FROM TANATBL

の代わりに

SELECT
(SELECT HIN_PRICE FROM HINMASTER WHERE HIN_CODE = TANATBL.HIN_CODE) AS HIN_PRICE
FROM TANATBL

のように取得フィールドからIDをはずしたこのクエリを実行すると

0
0
0
0
NULL

のような結果になりました。SELECT句の中のサブクエリーがうまく行かないような印象です。
#JETのSQLの仕様を探しているのですけど見つからないですね・・・
引用返信 編集キー/
■49052 / inTopicNo.8)  Re[7]: Decimalフィールドの取得
□投稿者/ らーじ (9回)-(2010/04/21(Wed) 10:31:22)
お返事遅くなり申し訳ないです。
やはりサブクエリでは不安定な部分がありましたのでLEFT JOINに変更しました所、期待通りの結果を得ることができました。

ありがとうございました。
解決済み
引用返信 編集キー/
■49095 / inTopicNo.9)  Re[8]: Decimalフィールドの取得
□投稿者/ みきぬ (875回)-(2010/04/22(Thu) 10:46:41)
HIN_CODE が整数型だと再現しませんね。ふしぎ!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -