最近、VB.NETでのSQL-Serverの関数およびプロシージャの実行をやったのでその忘備録です。
先ず、簡単な関数およびプロシージャをSQL-Serverに登録します。
FUNCTION、PROCEDURE共に階乗の計算を行います。VB.NETからの実行例ですので、 結果が桁数を超えるなどの制限は取り敢えず考えていません。
以下がそれぞれの内容です。
2012/06/13:の時の情報
先ず、簡単な関数およびプロシージャをSQL-Serverに登録します。
FUNCTION、PROCEDURE共に階乗の計算を行います。VB.NETからの実行例ですので、 結果が桁数を超えるなどの制限は取り敢えず考えていません。
以下がそれぞれの内容です。
-----------------------------------------
-- 階乗を計算する(関数)
-----------------------------------------
CREATE FUNCTION [dbo].[FuncTest](
@SrcNumber DECIMAL --引数
)
RETURNS DECIMAL
BEGIN
DECLARE @DesNumber DECIMAL
SET @DesNumber = 1
WHILE @SrcNumber > 0
BEGIN
SET @DesNumber = @DesNumber * @SrcNumber
SET @SrcNumber = @SrcNumber - 1
END
RETURN @DesNumber
END
-----------------------------------------
-- 階乗を計算する(プロシージャ)
-----------------------------------------
CREATE PROCEDURE [dbo].[ProcTest]
@SrcNumber DECIMAL --引数
,@DesNumber DECIMAL OUTPUT --戻り値
AS
BEGIN
SET @DesNumber = 1
WHILE @SrcNumber > 0
BEGIN
SET @DesNumber = @DesNumber * @SrcNumber
SET @SrcNumber = @SrcNumber - 1
END
END
VB.NETでの実行は以下の様になります。関数の実行および、プロシージャの実行を別の関数にしてあります。
'関数の実行
Private Sub TestFunc()
'コネクション・接続文字列
Dim Con As New System.Data.SqlClient.SqlConnection( _
"Data Source=(local)\SQLEXPRESS;" & _
"Initial Catalog=TEST;Integrated Security=SSPI")
Try
'コネクションオープン
Con.Open()
'取得関数SQL
Dim SQL As String = "SELECT [dbo].[FuncTest](@SrcNumber)"
'SQLコマンド生成(コネクション指定)
Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con)
'SQLコマンドへ引数設定
sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10))
'SQLコマンド実行
Dim obj As Object = sqlCommand.ExecuteScalar
Console.Write(CDec(obj))
Finally
'コネクション破棄
If Con.State <> System.Data.ConnectionState.Closed Then
Con.Close()
Con.Dispose()
End If
End Try
End Sub
'プロシージャの実行
Private Sub TestProc()
'コネクション・接続文字列
Dim Con As New System.Data.SqlClient.SqlConnection( _
"Data Source=(local)\SQLEXPRESS;" & _
"Initial Catalog=TEST;Integrated Security=SSPI")
Try
'コネクションオープン
Con.Open()
'取得関数SQL
Dim SQL As String = "[dbo].[ProcTest]"
'SQLコマンド生成
Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con)
'ストアド・プロシージャ設定
sqlCommand.CommandType = System.Data.CommandType.StoredProcedure
'SQLコマンドへ第1引数設定(SrcNumber)
sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10))
'SQLコマンドへ第2引数設定(DesNumber:出力指定)
Dim prmDesNumber As New System.Data.SqlClient.SqlParameter
With prmDesNumber
.ParameterName = "@DesNumber" 'パラメータ名
.DbType = Data.DbType.Decimal 'DBのデータ型
.Direction = System.Data.ParameterDirection.Output '出力
.Precision = 18 'DECIMAL(18,0)
.Scale = 0 '(小数点以下指定)
.Value = 0 '取り敢えず値をクリア
End With
sqlCommand.Parameters.Add(prmDesNumber)
'プロシージャ実行
sqlCommand.ExecuteNonQuery()
'戻り値を表示
Console.Write(prmDesNumber.Value)
Finally
'コネクション破棄
If Con.State <> System.Data.ConnectionState.Closed Then
Con.Close()
Con.Dispose()
End If
End Try
End Sub
=====2012/06/13:の時の情報
PR
コメント