忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

SQL-Serverの関数・プロシージャのVB.NETでの実行
最近、VB.NETでのSQL-Serverの関数およびプロシージャの実行をやったのでその忘備録です。

先ず、簡単な関数およびプロシージャを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

コメント

コメントを書く