- PR -

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

投稿者投稿内容
むら
会議室デビュー日: 2006/04/11
投稿数: 11
お住まい・勤務地: さっぽろ
投稿日時: 2006-05-12 18:17
-------------------------------------------------------------
'パラメータ戻り値取得用に宣言
Dim SqlParam as SqlParameger

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

   'パラメータ追加: 戻り値()
SqlParam = .Parameters("@TotalCount").Direction = ParameterDirection.Output

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

End With

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

'書き出す
Console.WriteLine("Number of Records: " & (SqlParam.Value))
-------------------------------------------------------------

上記のような感じでどうでしょうか。
たぶん「record_count = cmd2.ExecuteScalar() 」が違うのではないかと。
つまり、パラメータの戻り値は、ストアドの実行結果ではないということですね。
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 19:17
引用:

OUTPUTパラメータを使用せずとも
普通にストアドで select cnt=count(*) from table みたいな感じにすると
VBからは sqlcommand.commandtext="exec stored1 "
としてデータセットにアダプターからFillしてやれば取得できますよ



めだかさん、じゃんぬねっとさん、ありがとうございます。
あまり考えずに返信してしまい、申し訳ございませんでした。

下記のようにして、ストアド(引数有り)を使用して
レコード数を取得することができました。

<ストアド>
CREATE PROCEDURE sp_KAIKAKE_count @Sqlp_porder_begin char(10), @Sqlp_porder_end char(10) 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ソース>
Dim record_count As Integer

Dim cn2 As SqlConnection = New SqlConnection("Server=" & DB_SERVER & ";Initial Catalog=" & DB_CATALOG & ";User ID=" & DB_USER & ";Password=" & DB_PASSWORD & ";")
Dim cmd2 As New SqlClient.SqlCommand
Dim adp2 As New SqlClient.SqlDataAdapter
Dim dt2 As DataTable = New DataTable

'DB接続
cn2.ConnectionString = "Server=" & DB_SERVER & ";Initial Catalog=" & DB_CATALOG & ";User ID=" & DB_USER & ";Password=" & DB_PASSWORD & ";"
cn2.Open()
cmd2.Connection = cn2

cmd2.CommandText = "exec sp_KAIKAKE_count @Sqlp_porder_begin='" & porder_begin & "',@Sqlp_porder_end='" & porder_end & "'"
adp2.SelectCommand = cmd2
adp2.Fill(dt2)
record_count = dt2.Rows(0).Item("TotalCount")
cn2.Close()
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2006-05-12 19:27
引用:

むらさんの書き込み (2006-05-12 18:17) より:
-------------------------------------------------------------
'書き出す
Console.WriteLine("Number of Records: " & (SqlParam.Value))
-------------------------------------------------------------
上記のような感じでどうでしょうか。
たぶん「record_count = cmd2.ExecuteScalar() 」が違うのではないかと。
つまり、パラメータの戻り値は、ストアドの実行結果ではないということですね。




むらさん、ありがとうございます。
こんな感じにして試してみましたが、うまく値が取得できませんでした。
「型 'DBNull' から型 'Integer' へのキャストが有効ではありません」
というエラーが出ました。

戻り値の方法で、できないことはないと思うんですけど…。
とりあえず、他の方法でレコード数は取得できるようにはなりましたので
こちらの方法も色々試してみて、分かれば報告致します。

むらさん、めだかさん、じゃんぬねっとさん、ありがとうございました。

<VBソース>
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)
'パラメータ戻り値取得用に宣言
Dim SqlParam As SqlParameter

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

   'パラメータ追加: 戻り値()
   SqlParam = .Parameters.Add(New SqlParameter("@TotalCount", SqlDbType.Int, 4, "record_count"))
   .Parameters("@TotalCount").Direction = ParameterDirection.Output

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

'ストアド実行
cn2.Open()

cmd2.ExecuteScalar()
record_count = CInt(SqlParam.Value)

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