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

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

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

Re[8]: ExecuteReader の制約


(過去ログ 118 を表示中)

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

■69437 / inTopicNo.1)  ExecuteReader の制約
  
□投稿者/ MassyPie (4回)-(2013/12/26(Thu) 19:43:50)

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

いつも助けて頂き、ありがとうございます。
今回も、よろしくお願い致します。

下記の f_SQL を使用して、SELECT文の結果を加工しています。
今までは、

−−−−−−−−−−−−−−−−−−−−−−−−−−−
select aaa,bbb from owrgH order by aaa desc
−−−−−−−−−−−−−−−−−−−−−−−−−−−

程度のシンプルなSelect文しか実行したことがなかったのですが
今回、欲しいデータは、↓のようなSelect文を書かないと取れないと言われ、実行してみました。

−−−−−−−−−−−−−−−−−−−−−−−−−−−
SELECT SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16), COUNT(*) FROM HHHH1420 ( INDEX ( ID1_HHHH1420 ) ) WHERE HHAA = '1400' AND '2013/12/21 13:30:31' < HAAA AND HAAA <= '2013/12/26 13:30:31' AND HBBB = 11 AND SSSS = 'A' GROUP BY SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16) ORDER BY 1
−−−−−−−−−−−−−−−−−−−−−−−−−−−

エラーが発生し(メモ失念致しました。)、いろいろなSelect文を実行してみたところ、どうやら COUNT が入っていると
エラーになることが分かりました。
ちなみに、普通にプログラムからではなく、SQL Server Management Studioから動かすと正常のため
文法的な誤りはありません。



Q1.
SqlDataReaderを使用するにあたり、実行不可な関数があるのでしょうか?
もし、あるのであれば、その一覧が記載されているようなURLを教えて頂けるとありがたいです。
探してみましたが、見つけることができませんでした。


Q2.
例えば、COUNTの前に記述を追加すれば使えるなどありましたら、教えてください。



以上、ご教授の程よろしくお願い致します。




Public Function f_SQL(ByVal strDataSource As String, _
ByVal strUser As String, _
ByVal strPass As String, _
ByVal strInitialCatalog As String, _
ByVal dtItemConf As DataTable) As String

Dim strePN As String = My.Settings.ePN
Dim stConnectionString As String = String.Empty
Dim shtConf() As Short = Nothing

Dim strIntegratedSecurity As String = String.Empty


Dim intI As Integer = 0
Dim intJ As Integer = 0
Dim strErr As String = ""


stConnectionString &= "Data Source = " & strDataSource & ";"
stConnectionString &= "Initial Catalog = " & strInitialCatalog & ";"
stConnectionString &= "User ID=" & strUser & ";"
stConnectionString &= "Password=" & strPass & ";"


' SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString)

' データベース接続を開く
Try
cSqlConnection.Open()
Catch ex As Exception
GoTo CloseProc
End Try

' 接続に成功した旨を表示する
'MessageBox.Show("Microsoft SQL Server に接続されました")

For intJ = 0 To (dtItemConf.Rows.Count - 1) Step 1

'-----------------------------------
' select文実行
'-----------------------------------

' cSqlConnection から SqlCommand のインスタンスを生成する
Dim hCommand As System.Data.SqlClient.SqlCommand = cSqlConnection.CreateCommand()


' 実行する SQL コマンドを設定する
hCommand.CommandText = dtItemConf(intJ)(cintC_Sql)

Dim cReader As System.Data.SqlClient.SqlDataReader = Nothing

Try
' 指定した SQL コマンドを実行して SqlDataReader を構築する
cReader = hCommand.ExecuteReader()

Catch ex As Exception
GoTo NextSql
End Try

' hCommand を破棄する (正しくは オブジェクトの破棄を保証する を参照)
hCommand.Dispose()

---------------------------

---------------------------

NextSql:
' cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
cReader.Close()

Next intJ

Return (True)


CloseProc:
' データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照)
cSqlConnection.Close()
cSqlConnection.Dispose()

Return (strErr)
End Function


引用返信 編集キー/
■69442 / inTopicNo.2)  Re[1]: ExecuteReader の制約
□投稿者/ WebSurfer (139回)-(2013/12/26(Thu) 22:07:58)
No69437 (MassyPie さん) に返信
> いつも助けて頂き、ありがとうございます。
> 今回も、よろしくお願い致します。
>
> 下記の f_SQL を使用して、SELECT文の結果を加工しています。
> 今までは、
>
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
> select aaa,bbb from owrgH order by aaa desc
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
>
> 程度のシンプルなSelect文しか実行したことがなかったのですが
> 今回、欲しいデータは、↓のようなSelect文を書かないと取れないと言われ、実行してみました。
>
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
> SELECT SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16), COUNT(*) FROM HHHH1420 ( INDEX ( ID1_HHHH1420 ) ) WHERE HHAA = '1400' AND '2013/12/21 13:30:31' < HAAA AND HAAA <= '2013/12/26 13:30:31' AND HBBB = 11 AND SSSS = 'A' GROUP BY SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16) ORDER BY 1
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
>
> エラーが発生し(メモ失念致しました。)、いろいろなSelect文を実行してみたところ、どうやら COUNT が入っていると
> エラーになることが分かりました。
> ちなみに、普通にプログラムからではなく、SQL Server Management Studioから動かすと正常のため
> 文法的な誤りはありません。
>
>
>
> Q1.
> SqlDataReaderを使用するにあたり、実行不可な関数があるのでしょうか?
> もし、あるのであれば、その一覧が記載されているようなURLを教えて頂けるとありがたいです。
> 探してみましたが、見つけることができませんでした。
>
>
> Q2.
> 例えば、COUNTの前に記述を追加すれば使えるなどありましたら、教えてください。
>
>
>
> 以上、ご教授の程よろしくお願い致します。
>
>
>
>
> Public Function f_SQL(ByVal strDataSource As String, _
> ByVal strUser As String, _
> ByVal strPass As String, _
> ByVal strInitialCatalog As String, _
> ByVal dtItemConf As DataTable) As String
>
> Dim strePN As String = My.Settings.ePN
> Dim stConnectionString As String = String.Empty
> Dim shtConf() As Short = Nothing
>
> Dim strIntegratedSecurity As String = String.Empty
>
>
> Dim intI As Integer = 0
> Dim intJ As Integer = 0
> Dim strErr As String = ""
>
>
> stConnectionString &= "Data Source = " & strDataSource & ";"
> stConnectionString &= "Initial Catalog = " & strInitialCatalog & ";"
> stConnectionString &= "User ID=" & strUser & ";"
> stConnectionString &= "Password=" & strPass & ";"
>
>
> ' SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
> Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString)
>
> ' データベース接続を開く
> Try
> cSqlConnection.Open()
> Catch ex As Exception
> GoTo CloseProc
> End Try
>
> ' 接続に成功した旨を表示する
> 'MessageBox.Show("Microsoft SQL Server に接続されました")
>
> For intJ = 0 To (dtItemConf.Rows.Count - 1) Step 1
>
> '-----------------------------------
> ' select文実行
> '-----------------------------------
>
> ' cSqlConnection から SqlCommand のインスタンスを生成する
> Dim hCommand As System.Data.SqlClient.SqlCommand = cSqlConnection.CreateCommand()
>
>
> ' 実行する SQL コマンドを設定する
> hCommand.CommandText = dtItemConf(intJ)(cintC_Sql)
>
> Dim cReader As System.Data.SqlClient.SqlDataReader = Nothing
>
> Try
> ' 指定した SQL コマンドを実行して SqlDataReader を構築する
> cReader = hCommand.ExecuteReader()
>
> Catch ex As Exception
> GoTo NextSql
> End Try
>
> ' hCommand を破棄する (正しくは オブジェクトの破棄を保証する を参照)
> hCommand.Dispose()
>
> ---------------------------
> 略
> ---------------------------
>
> NextSql:
> ' cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
> cReader.Close()
>
> Next intJ
>
> Return (True)
>
>
> CloseProc:
> ' データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照)
> cSqlConnection.Close()
> cSqlConnection.Dispose()
>
> Return (strErr)
> End Function
>
>
引用返信 編集キー/
■69443 / inTopicNo.3)  Re[1]: ExecuteReader の制約
□投稿者/ WebSurfer (140回)-(2013/12/26(Thu) 22:12:42)
すみません、間違えて[送信]ボタンをクリックしてしまいました。

No69437 (MassyPie さん) に返信
> エラーが発生し(メモ失念致しました。)、いろいろなSelect文を実行してみたところ、どうやら COUNT が入っていると

どの行でどのようなエラーメッセージが出ているか書いてください。

あと、コードの書き方をもっと考えた方がいいと思います。catch でどこかに飛ばして Dispose/Close する
のではなくて try - finally とするか、using 句を使うなど・・・


引用返信 編集キー/
■69444 / inTopicNo.4)  Re[2]: ExecuteReader の制約
□投稿者/ MassyPie (5回)-(2013/12/26(Thu) 22:41:46)
WebSurferさん

コメントありがとうございます。

cReader = hCommand.ExecuteReader() で、エラーが出ています。

エラーは明日アップしたいと思います。
ただ、セキュリティの厳しい建物で、明日は仕事収めなので入棟できるか・・・


このコードは、そんなにヘンテコなのですか?
ヘンテコ加減を調べてみることにします。

ありがとうございます。
引用返信 編集キー/
■69445 / inTopicNo.5)  Re[3]: ExecuteReader の制約
□投稿者/ WebSurfer (141回)-(2013/12/26(Thu) 23:04:43)
No69444 (MassyPie さん) に返信
> WebSurferさん
>
> コメントありがとうございます。
>
> cReader = hCommand.ExecuteReader() で、エラーが出ています。

エラーメッセージは変に省略しないで、そのままコピペしてくださいね。

また、デバッガでその時の hCommand.CommandText を調べてみてください。
加えて、SQL Server Management Studio でそのクエリを実行して期待通りの結果が
得られるかも調べてください

> このコードは、そんなにヘンテコなのですか?
> ヘンテコ加減を調べてみることにします。

自分的には、失礼ながら、正直言うと、ヘンテコ以上です。基本は以下のページを
見てください。

.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx

引用返信 編集キー/
■69446 / inTopicNo.6)  Re[4]: ExecuteReader の制約
□投稿者/ MassyPie (6回)-(2013/12/27(Fri) 00:26:29)
WebSurferさん

コメントありがとうございます。
例外処理について、サイトをチェックしてみます。

明日、エラーコードをアップできるようにがんばってみます。



WebSurferさんの今回の質問を拝見し、私の質問内容がみなさまに伝わっているのか少し不安になりましたので、質問事項をまとめます。

<状況>

select文1
select aaa,bbb from owrgH order by aaa desc


select文2
SELECT SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16), COUNT(*) FROM HHHH1420 ( INDEX ( ID1_HHHH1420 ) ) WHERE HHAA = '1400' AND '2013/12/21 13:30:31' < HAAA AND HAAA <= '2013/12/26 13:30:31' AND HBBB = 11 AND SSSS = 'A' GROUP BY SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16) ORDER BY 1


hCommand.CommandText には、select文1、2を設定しました。


■SQL Server Management Studioからの実行
select文1:OK
select文2:OK

■f_SQLからの実行
select文1:OK
select文2:NG、cReader = hCommand.ExecuteReader() でエラー(エラーコード失念)



<質問内容>

Q1.
SqlDataReaderを使用するにあたり、実行不可な関数、文字列(予約語)があるのでしょうか?
もし、あるのであれば、その一覧が記載されているようなURLを教えて頂けるとありがたいです。
探してみましたが、見つけることができませんでした。

実際には、select文は何パターンが実行してみたのですが、COUNT がselect文に入るとcReader = hCommand.ExecuteReader() でエラーとなったからです。
また、Oracleですが、前回の質問(69379 / Oracle Select文 )のようなことがあるかと思ったからです。


Q2.
使用不可で無い場合、COUNTをどのようにselect文中に記述すればよいのか、アドバイスを頂きたく。
ex.COUNTを()で囲むなど


よく考えると明日はやはり入棟の制限があり、エラーをメモって来るのは厳しいそうなので、COUNT が使えるか使えないか、それだけは年内に知っておきたい。と思い、質問しております。
エラーコードが先というのは十分承知しておりますが、何かアドバイスありましたら、よろしくお願い致します。


引用返信 編集キー/
■69447 / inTopicNo.7)  Re[1]: ExecuteReader の制約
□投稿者/ しま (59回)-(2013/12/27(Fri) 00:27:02)
No69437 (MassyPie さん) に返信
> いつも助けて頂き、ありがとうございます。
> 今回、欲しいデータは、↓のようなSelect文を書かないと取れないと言われ、実行してみました。
>
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
> SELECT SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16), COUNT(*) FROM HHHH1420 ( INDEX ( ID1_HHHH1420 ) ) WHERE HHAA = '1400' AND '2013/12/21 13:30:31' < HAAA AND HAAA <= '2013/12/26 13:30:31' AND HBBB = 11 AND SSSS = 'A' GROUP BY SUBSTRING(CONVERT(VARCHAR, HAAA, 120), 1, 16) ORDER BY 1
> −−−−−−−−−−−−−−−−−−−−−−−−−−−
>
> エラーが発生し(メモ失念致しました。)、いろいろなSelect文を実行してみたところ、どうやら COUNT が入っていると
> エラーになることが分かりました。
> ちなみに、普通にプログラムからではなく、SQL Server Management Studioから動かすと正常のため
> 文法的な誤りはありません。

Sql Server では index を指定するときには with が必要なのではないですか?
from HHHH1420 (index(ID1_HHHH1420)) ではなく
from HHHH1420 with(index(IOD1_HHHH1420)) なのではないかと思いますが、間違っていますか?

他に、本当に
order by 1
でいいんですか?
仮に列名が数字の "1" だとしても、group by で指定していない列で order by する意味がよく判りません。
引用返信 編集キー/
■69448 / inTopicNo.8)  Re[2]: ExecuteReader の制約
□投稿者/ しま (60回)-(2013/12/27(Fri) 01:57:06)
No69447 (しま さん) に返信
> ■No69437 (MassyPie さん) に返信
> Sql Server では index を指定するときには with が必要なのではないですか?
> from HHHH1420 (index(ID1_HHHH1420)) ではなく
> from HHHH1420 with(index(IOD1_HHHH1420)) なのではないかと思いますが、間違っていますか?

from HHHH1420 with(index(ID1_HHHH1420)) の打ち間違いでした
引用返信 編集キー/
■69451 / inTopicNo.9)  Re[5]: ExecuteReader の制約
□投稿者/ WebSurfer (142回)-(2013/12/27(Fri) 09:55:01)
No69446 (MassyPie さん) に返信
> よく考えると明日はやはり入棟の制限があり、エラーをメモって来るのは厳しいそうなので、COUNT が使えるか使えないか、それだけは年内に知っておきたい。と思い、質問しております。
> エラーコードが先というのは十分承知しておりますが、何かアドバイスありましたら、よろしくお願い致します。

単純に、COUNT が使えるか否かという質問なら、答えは「使えます」です。

ただし、質問にあったクエリを質問にあったコードで使って問題ないか否かは、
テーブルのスキーマも不明で、コードも省略してあるし、クエリの格納してある
らしい DataTable の中身が不明という状況では分かりません。

このような質問をする際は、回答者のほうでも問題を再現できるように、Northwind
などのサンプルデータベースを使い、問題を再現できる必要最小限(あくまで必要
最小限、逆に肝心な部分の省略はしない)のコードをアップすることをお勧めします。
引用返信 編集キー/
■69457 / inTopicNo.10)  Re[3]: ExecuteReader の制約
□投稿者/ しま (62回)-(2013/12/27(Fri) 12:55:31)
No69448 (しま さん) に返信

select 文の意図は分単位での行数が欲しいということの様なので count(*) ではなく
count(HAAA) か count(substring(convert(varchar, HAAA, 120), 1, 16)) かなら上手くいくかも知れません.

引用返信 編集キー/
■69463 / inTopicNo.11)  Re[4]: ExecuteReader の制約
□投稿者/ WebSurfer (144回)-(2013/12/27(Fri) 15:35:40)
No69457 (しま さん) に返信
> ■No69448 (しま さん) に返信
>
> select 文の意図は分単位での行数が欲しいということの様なので count(*) ではなく
> count(HAAA) か count(substring(convert(varchar, HAAA, 120), 1, 16)) かなら上手くいくかも知れません.
>

クエリの間違いだとすると、質問者さんからの以下の情報が解せないです。

■SQL Server Management Studioからの実行
select文1:OK
select文2:OK

■f_SQLからの実行
select文1:OK
select文2:NG、cReader = hCommand.ExecuteReader() でエラー(エラーコード失念)

なので、(1) 前者の select文2 と後者の select文2 が実は違う、(3) 同じだとするとコーディングの
不具合、(3) 実はエラーではなくデータは取得できているがその後うまく処理できてない・・・といった
ところではないかと想像しています。

質問者さんからのエラーメッセージ詳細の連絡を待ちたいと思います。

できれば、問題を再現するのにコードを最小限に削っていろいろ試してもらえると、解決が早いと思うの
ですが・・・
引用返信 編集キー/
■69464 / inTopicNo.12)  Re[5]: ExecuteReader の制約
□投稿者/ しま (63回)-(2013/12/27(Fri) 15:46:26)
No69463 (WebSurfer さん) に返信
>
> クエリの間違いだとすると、質問者さんからの以下の情報が解せないです。
>
> ■SQL Server Management Studioからの実行
> select文1:OK
> select文2:OK
>
> ■f_SQLからの実行
> select文1:OK
> select文2:NG、cReader = hCommand.ExecuteReader() でエラー(エラーコード失念)
>
> なので、(1) 前者の select文2 と後者の select文2 が実は違う、(3) 同じだとするとコーディングの
> 不具合、(3) 実はエラーではなくデータは取得できているがその後うまく処理できてない・・・といった
> ところではないかと想像しています。
>
> 質問者さんからのエラーメッセージ詳細の連絡を待ちたいと思います。
>
> できれば、問題を再現するのにコードを最小限に削っていろいろ試してもらえると、解決が早いと思うの
> ですが・・・

ExecureReader() が失敗しているとのことなので、クエリー文の問題ではないかと考えた次第です。
ただ、データーセットとの辻褄が合っていない場合でも例外が出るのでデーターテーブルの定義が知りたいですね。
引用返信 編集キー/
■69533 / inTopicNo.13)  Re[6]: ExecuteReader の制約
□投稿者/ MassyPie (7回)-(2014/01/07(Tue) 09:20:35)
みなさま

いろいろとアドバイスをありがとうございます。

他社のDBからデータを取得していることもあり、私たちはSQL文しか渡されず、テーブル構成も分かりませんし、データ(ダミーデータさえも)もらうことができません。
その代わりに、私たちが欲しいデータが取得できる正常に動くSQL文を頂くことになっているのですが、今回はこれがクリアされていないという判断の元、新しいSQL文待ちとなりました。

「SQL文が悪い」という前に、ExecuteReaderの制約でデータが取れないのではないかなど、いろいろ調べたのですが、そうではなく「SQL文が悪そうだ。」というエビデンスがいくつか得られたので、それを提出しSQL文の見直しをしてもらえることになりました。

直接の解決ではないのですが、本件クローズさせて頂きます。

たくさんのアドバイスありがとうございます。<(__)>
解決済み
引用返信 編集キー/
■69538 / inTopicNo.14)  Re[7]: ExecuteReader の制約
□投稿者/ shu (462回)-(2014/01/07(Tue) 12:05:47)
No69533 (MassyPie さん) に返信

とりあえず違うかもしれませんが、
Readerを既に開いている1つのコネクションから
もう一つReaderを開くことは出来ません。
1つ目のSQLですべて読み込みクローズしてから2つ目のSQLでの読み込みを開始するか
コネクションを2つ用意してそれぞれのコネクションからReaderを開く必要があります。

大丈夫でしょうか?
引用返信 編集キー/
■69575 / inTopicNo.15)  Re[8]: ExecuteReader の制約
□投稿者/ MassyPie (8回)-(2014/01/09(Thu) 17:07:25)
shu さん

> Readerを既に開いている1つのコネクションから
> もう一つReaderを開くことは出来ません。

テスト環境でデバッガを動かしていた時に、まさにこのエラーが出て修正しましたので、大丈夫です。

今日、新しいSelect文をもらい、正常にデータが取れました。
お騒がせして申し訳ありませんでした。<(__)>

また、困った時にはよろしくお願い致します。


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -