3

2 つのパラメーターを受け取り、整数を返す SQL Server で作成された呼び出し関数が必要です。ストアド プロシージャを呼び出すときは、次のコードを使用します。

    sqlcmd.CommandType = CommandType.StoredProcedure
    sqlcmd.CommandText = "PROCEDURE_NAME"

    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))
    da = New SqlClient.SqlDataAdapter()
    da.SelectCommand = sqlcmd
    table = New DataTable()
    da.Fill(table)

この場合、ストアド プロシージャによって返されるテーブルがあります。ストアド プロシージャの代わりにスカラー値を返す関数を使用する場合、何が変わりますか?

4

3 に答える 3

5

その関数を直接呼び出すことはできません。 StoredProcedureText( query ) 、およびTableDirectのみが許可されています。ストアド プロシージャで既に公開されているので、その関数を持つプロシージャを作成してみませんか?

ExecuteScalarC# コードでは、コマンド オブジェクトの を使用できます。

sqlcmd.CommandType = CommandType.StoredProcedure
sqlcmd.CommandText = "PROCEDURE_NAME"
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))

Dim obj as Object = sqlcmd.ExecuteScalar() 
' obj hold now the value from the stored procedure.

ストアド プロシージャは次のようになります。

CREATE PROCEDURE PROCEDURE_NAME
    @param1 VARCHAR(15),
    @param2 VARCHAR(15)
AS
BEGIN
    SELECT function_name(@param1, @param2)
    FROM...
    WHERE....
END
于 2012-09-11T07:44:08.167 に答える
2

単一の値を返したい場合は、SELECT クエリを使用して関数を呼び出すことができます

SQL サーバー コード

CREATE FUNCTION Test
(
  @p1 varchar(10),
  @p2 varchar(10)
)
RETURNS varchar(20)
AS
BEGIN
  RETURN @p1 + @p2
END

vb.net コード

Using cnn As New SqlClient.SqlConnection("Your Connection String")
  Using cmd As New SqlClient.SqlCommand("SELECT dbo.Test(@p1,@p2)", cnn)
    cmd.Parameters.AddWithValue("@p1", "1")
    cmd.Parameters.AddWithValue("@p2", "2")

    Try
      cnn.Open()
      Console.WriteLine(cmd.ExecuteScalar.ToString)  //returns 12
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    End Try
  End Using
End Using
于 2012-09-11T15:34:08.503 に答える
1

ストアド プロシージャから値を単一の行、単一列の結果セットとして返す場合は、SqlCommand.ExecuteScalarメソッドを使用します。

私の好みの方法は、TSQL ステートメントに応じて記述されたストアド プロシージャの戻り値を実際に使用しRETURN、 を呼び出すことSqlCommand.ExecuteNonQueryです。

MSDN の両方で例が提供されていますが、特定の状況では、

Dim returnValue As SomeValidType

Using connection = New SqlConnection(connectionString))
    SqlCommand command = New SqlCommand() With _
        {
            CommandType = CommandType.StoredProcedure, _
            CommandText = "PROCEDURE_NAME" _
        }

    command.Parameters.Add(New SqlParameter() With _
        {
            Name = "@RC", _
            DBType = SomeSQLType, _
            Direction = ParameterDirection.ReturnValue  _ // The important bit
        }
    command.AddWithValue("@param1", Utilities.NothingToDBNull(user))
    command.AddWithValue("@param2", Utilities.NothingToDBNull(password))

    command.Connection.Open()
    command.ExecuteNonQuery()

    returnValue = CType(command.Parameters["@RC"].Value, SomeValidType)
End Using

余談ですが、.Net 4.5にはこれらの関数の便利な非同期バージョンがあることに気付くでしょうが、それは質問の範囲を超えているのではないかと心配しています。

于 2012-09-11T15:46:33.007 に答える