- PR -

vb.net ストアドでレコード数(count)の取得をしたい

投稿者投稿内容
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 16:34
VB.NETで開発中です。DBはSQLServer2003StandardEditionです。

ストアドを使用し、特定のselect文のレコード数をcountで取得しようとしています。

引数と戻り値有りのストアドでExecuteScalarを使用しています。
(結果が複数ではないので)

エラーの原因が分からず、ストアドの@TotalCountの型を変更してみたりしたのですが、エラーが無くなりません。
色々、調べてみたのですが、これというものが見つけることができず原因が分かりませんでした。
ストアドのSQL文は、直打で正しい件数が出たので間違っていません。
もし、何か分かる方がいらっしゃいましたら、ご教授願います。

<ストアド>
CREATE PROCEDURE KAIKAKE_count @Sqlp_porder_begin char(10), @Sqlp_porder_end char(10), @TotalCount int OUTPUT AS
select @Totalcount = count(*)
from VKAIK
left join VGNKB on VKAIK.PORDER = VGNKB.PORDER and STATE = 1
left join XMLOT on VGNKB.SEIBAN = XMLOT.SEIBAN and VGNKB.EDA = XMLOT.EDA
where VKAIK.PORDER >= @Sqlp_porder_begin and VKAIK.PORDER <= @Sqlp_porder_end
GO

<VBソース1>
Dim record_count As Integer

'ストアド設定
Const StoredRecordCount As String = "KAIKAKE_count"

Dim cn2 As SqlConnection = New SqlConnection("Server=" & DB_SERVER & ";Initial Catalog=" & DB_CATALOG & ";User ID=" & DB_USER & ";Password=" & DB_PASSWORD & ";")
Dim cmd2 As SqlCommand = New SqlCommand(StoredRecordCount, cn2)

With cmd2
   'CommandTextの種別 = ストアド
   .CommandType = CommandType.StoredProcedure

   'パラメータ追加: 戻り値()
   .Parameters.Add("@TotalCount", "record_count")

   'パラメータ追加:引数
   .Parameters.Add("@Sqlp_porder_begin", "porder_begin")
   .Parameters.Add("@Sqlp_porder_end", "porder_end")
End With

'ストアド実行
cn2.Open()
record_count = cmd2.ExecuteScalar()

<実行結果1>
record_count = cmd2.ExecuteScalar()で
型 nvarchar から型 int への変換エラー

<VBソース2>
VBソース1を下記の部分変更
   'パラメータ追加: 戻り値()
   .Parameters.Add(New SqlParameter("@TotalCount", SqlDbType.Int, 4, "record_count"))
   .Parameters("@TotalCount").Direction = ParameterDirection.ReturnValue

<実行結果2>
record_count = cmd2.ExecuteScalar()で
プロシージャ 'KAIKAKE_count' にはパラメータ '@TotalCount' を指定してください。
むら
会議室デビュー日: 2006/04/11
投稿数: 11
お住まい・勤務地: さっぽろ
投稿日時: 2006-05-12 17:09
こんにちは。

的外れかもしれませんが、

パラメータ@TotalCountの
DirectionをParameterDirection.Outputに設定してみるとかで
いけないでしょうか。
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 17:49
引用:

むらさんの書き込み (2006-05-12 17:09) より:
パラメータ@TotalCountの
DirectionをParameterDirection.Outputに設定してみるとかで
いけないでしょうか。



むらさん、ありがとうございます。

<VBソース2>の方ですね。
   'パラメータ追加: 戻り値()
   .Parameters.Add(New SqlParameter("@TotalCount", SqlDbType.Int, 4, "record_count"))
   .Parameters("@TotalCount").Direction = ParameterDirection.Output

にしたら

エラー「プロシージャ 'KAIKAKE_count' にはパラメータ '@TotalCount' を指定してください。」
は、出なくなりました。ありがとうございます。

しかし、値は取れていませんでした。
cmd2.ExecuteScalar()をクイックウォッチでみたらNothingとなっています。
ここに数字が返るようにならないといけないのかな?

引き続き、何か分かる方がいらっしゃいましたらよろしくお願い致します。
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-05-12 17:50
OUTPUTパラメータを使用せずとも
普通にストアドで select cnt=count(*) from table みたいな感じにすると

VBからは sqlcommand.commandtext="exec stored1 "
としてデータセットにアダプターからFillしてやれば取得できますよ

Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 17:56
引用:

めだかさんの書き込み (2006-05-12 17:50) より:
OUTPUTパラメータを使用せずとも
普通にストアドで select cnt=count(*) from table みたいな感じにすると

VBからは sqlcommand.commandtext="exec stored1 "
としてデータセットにアダプターからFillしてやれば取得できますよ



めだかさん、ありがとうございます。

ストアドにしている理由は、レコード数が多くてタイムアウトが
発生することがあったからなんです。

普通のselect文のcommandはいつも使用しているのでやり方は分かります。
ストアドで方法がわかれば、ぜひ知りたいのです。

よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-12 17:59
引用:

Taitoさんの書き込み (2006-05-12 17:56) より:

普通のselect文のcommandはいつも使用しているのでやり方は分かります。
ストアドで方法がわかれば、ぜひ知りたいのです。


だから、同じですよね。
CommandType.StoredProcedure くらいでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 17:59
めだかさん、すみません。

早合点してしまいました。

ちょっと、試してみます。
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 18:01
じゃんぬねっとさんも、すみません。
ありがとうございます。

今から試してみます。

スキルアップ/キャリアアップ(JOB@IT)