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

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

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

Re[3]: Oracle Select文


(過去ログ 118 を表示中)

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

■69379 / inTopicNo.1)  Oracle Select文
  
□投稿者/ MassyPie (1回)-(2013/12/20(Fri) 20:30:40)

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

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

次のselect文を下記のプログラムより実行しています。
sqlplueで、実行すると問題なく検索してくれるので文法的に誤りはないのですが
プログラムを通すと、検索結果=0になります。

ただ単純に次のselect文であると、プログラムからでも正しい検索が行われます。
SELECT value,timestamp from itemdata order by timestamp DESC

プログラムから実行するには、Where句の時間条件の指定がまずいと思うのですが、何が悪いのか、または考えられることを
ご指摘頂けると助かります。

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



<Select文>
SELECT value,timestamp from itemdata where ((TO_DATE('2013/12/15 20:10:20','YYYY/MM/DD HH24:MI:SS')) < timestamp) and (timestamp <= TO_DATE('2013/12/20 20:10:20','YYYY/MM/DD HH24:MI:SS')) order by timestamp DESC



<プログラム>
Public Sub GetORACLE(strUser As String, strPass As String, strSource As String, strSql As String, dt As DataTable)
Dim bldr As OracleConnectionStringBuilder = New OracleConnectionStringBuilder()

'ユーザ名とパスワードを指定する
bldr.UserID = strUser
bldr.Password = strPass
bldr.DataSource = strSource

'dt = New DataTable()

Using conn As OracleConnection = New OracleConnection(bldr.ConnectionString)
Using cmd As OracleCommand = New OracleCommand()
'コマンドのコネクションを指定
cmd.Connection = conn
cmd.CommandText = strSql
'SELECTコマンドを指定する
oda.SelectCommand = cmd
'OracleConnectionを明示的にオープンにしなくても、Fillメソッドの中で開いて、終われば自動的に閉じてくれる
oda.Fill(dt)
''DataGridViewにデータソースを指定する
'Me.DataGridView1.DataSource = dt
End Using
End Using
End Sub
引用返信 編集キー/
■69383 / inTopicNo.2)  Re[1]: Oracle Select文
□投稿者/ 魔界の仮面弁士 (470回)-(2013/12/20(Fri) 22:56:16)
No69379 (MassyPie さん) に返信
> sqlplueで、実行すると問題なく検索してくれるので

SQL*Plus 側で INSERT した後、Commit し忘れているとか…?


> プログラムを通すと、検索結果=0になります。

OracleConnection クラス等をお使いのようですが、これは
Oracle.DataAccess.Client 名前空間のものでしょうか。
それとも、System.Data.OracleClient のものでしょうか。
推奨されているのは前者の名前空間ですね。


> SELECT value,timestamp from itemdata
> where ((TO_DATE('2013/12/15 20:10:20','YYYY/MM/DD HH24:MI:SS')) < timestamp)
> and (timestamp <= TO_DATE('2013/12/20 20:10:20','YYYY/MM/DD HH24:MI:SS')) order by timestamp DESC

これ、データ型はどうなっていますか?

timestamp という列名ということは、やはりデータ型も
TIMESTAMP 型 あるいは TIMESTAMP WITH TIME ZONE 型なのでしょうか。

だとしたら、使うべきは TO_DATE 関数ではなく
TO_TIMESTAMP もしくは TO_TIMESTAMP_TZ ですよ。


CREATE TABLE itemdata ( value NUMBER(3), timestamp TIMESTAMP(9) );

-- TO_TIMESTAMP 関数の代わりに、TIMESTAMP リテラル表記を使うこともできる
INSERT ALL
INTO itemdata VALUES ( 1, TIMESTAMP '2013-12-15 20:09:19.999999999')
INTO itemdata VALUES ( 2, TIMESTAMP '2013-12-15 20:10:20.000000000')
INTO itemdata VALUES ( 3, TIMESTAMP '2013-12-15 20:10:20.000000001')
INTO itemdata VALUES (11, TIMESTAMP '2013-12-15 23:59:59.999999999')
INTO itemdata VALUES (12, TIMESTAMP '2013-12-16 00:00:00.000000000')
INTO itemdata VALUES (13, TIMESTAMP '2013-12-16 00:00:00.000000001')
INTO itemdata VALUES (21, TIMESTAMP '2013-12-20 20:09:19.999999999')
INTO itemdata VALUES (22, TIMESTAMP '2013-12-20 20:10:20.000000000')
INTO itemdata VALUES (23, TIMESTAMP '2013-12-20 20:10:20.000000001')
SELECT * FROM DUAL;

-- 下記の場合、3〜22 が選択されるが、1, 2, 23 は選択されない
SELECT value, timestamp FROM itemdata
WHERE TO_TIMESTAMP('2013/12/15 20:10:20.000000000', 'YYYY/MM/DD HH24:MI:SS.FF9') < timestamp
AND timestamp <= TO_TIMESTAMP('2013/12/20 20:10:20.000000000', 'YYYY/MM/DD HH24:MI:SS.FF9')
ORDER BY timestamp DESC;



> Public Sub GetORACLE(strUser As String, strPass As String, strSource As String, strSql As String, dt As DataTable)
本題とは直接関係ありませんが、命名的には、
 Function GetORACLE(…) As DataTable
あるいは
 Sub FillORACLE(dt As DataTable, …)
の方が良い気がします。TableAdapter の Get/Fill 系メソッドが上記ルールなので。


> oda.SelectCommand = cmd
ここで使用している変数 oda は、どこから来ていますか?
変数宣言が無いということは、フィールド変数あるいは Module のグローバル変数でしょうか。

むやみに使いまわさず、GetORACLE 内でのローカル変数として
処理した方が良いと思います。たとえばこんな感じで(未検証)。

Using oda As New OracleDataAdapter(strSql, bldr.ConnectionString)
 oda.Fill(dt)
End Using
引用返信 編集キー/
■69398 / inTopicNo.3)  Re[1]: Oracle Select文
□投稿者/ a (3回)-(2013/12/23(Mon) 09:22:50)
No69379 (MassyPie さん) に返信
> <Select文>
> SELECT value,timestamp from itemdata where ((TO_DATE('2013/12/15 20:10:20','YYYY/MM/DD HH24:MI:SS')) < timestamp) and (timestamp <= TO_DATE('2013/12/20 20:10:20','YYYY/MM/DD HH24:MI:SS')) order by timestamp DESC
>
魔界の仮面弁士さんが書かれている様に、timestampがどうなっているかはわかりませんが、それとは別件で、
条件が'<'と'<='になっていますので'2013/12/15 20:10:20'以下のものしか出てこなそう。
引用返信 編集キー/
■69402 / inTopicNo.4)  Re[1]: Oracle Select文
□投稿者/ オショウ (116回)-(2013/12/23(Mon) 11:38:45)
No69379 (MassyPie さん) に返信
> プログラムを通すと、検索結果=0になります。

  原因は、ODP.NETを経由してアクセスする場合のカラム名が予約語と
  誤認されていたからです。

  要は、カラム名『timestamp』(小文字)が、属性のTIMESTAMPと同様に
  扱われていた為でした。

  カラム名『timestamp』を『YMDHMS』等の全く違う文字列に変更すれば
  問題なく検索結果が取得できました。

以上。参考まで
引用返信 編集キー/
■69405 / inTopicNo.5)  Re[2]: Oracle Select文
□投稿者/ MassyPie (3回)-(2013/12/24(Tue) 13:55:09)
<魔界の仮面弁士さん>

アドバイス、ありがとうございます。
今、確認しながら修正を行っています。



<aさん>

コメントありがとうございます。
シンプルにすると、↓のようになり、'2013/12/15 20:10:20' より大きく'2013/12/20 20:10:20'以下のデータが取れています。
('2013/12/15 20:10:20' < timestamp) and (timestamp <= '2013/12/20 20:10:20')


<オショウさん>

ありがとうございます。
小文字の timestamp であれば、大丈夫と思いFieldを作成されたようです。
早速、Field名の変更依頼し、テストしたところOKでした。

SqlPlusの実行で問題なかったので、Field名とは思いませんでした。
本当にありがとうございます。


みなさま、本当にありがとうございます。<(__)>
解決済み
引用返信 編集キー/
■69406 / inTopicNo.6)  Re[3]: Oracle Select文
□投稿者/ a (6回)-(2013/12/24(Tue) 14:43:11)
No69405 (MassyPie さん) に返信
> <aさん>
>
> コメントありがとうございます。
> シンプルにすると、↓のようになり、'2013/12/15 20:10:20' より大きく'2013/12/20 20:10:20'以下のデータが取れています。
> ('2013/12/15 20:10:20' < timestamp) and (timestamp <= '2013/12/20 20:10:20')
>
すみません。
意図は理解できていたはずですが、なんか勘違いしてたみたいです。
お騒がせしました。m(_._)m
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -