2012-09-11 4 views
2

Я хочу, чтобы функция вызова, созданная в SQL Server, получала два параметра и возвращала целое число. Когда я вызываю хранимую процедуру, я использую следующий код:Вызов функции SQL с использованием ADO .NET

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) 

В этом случае у меня есть таблица, возвращаемая хранимой процедурой. Какие изменения, если я хочу использовать функцию, которая возвращает скалярное значение вместо хранимой процедуры?

+0

Возможно, ваши ищут [Как вызвать функцию TSQL из ado.net] [1] [1]: http://stackoverflow.com/questions/4145329/how-do- i-call-a-tsql-function-from-ado-net –

+0

@John Но я хочу просто скалярное значение retunr! Зачем использовать хранимую процедуру? Вы уверены, что я не могу напрямую вызвать функцию? – GVillani82

+0

@Cuong Я попытался с вашим кодом, но не вернул правильное значение. – GVillani82

ответ

5

Вы не можете вызвать эту функцию непосредственно, только StoredProcedure, Text (запрос), и TableDirect позволены. Поскольку вы уже разоблачены хранимой процедурой, почему бы не создать процедуру, на которой есть функция?

В коде C#, вы можете использовать ExecuteScalar вашего объекта команды

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 
0

Если вы хотите, чтобы вернуть одно значение, вы можете вызвать функцию, используя запрос SELECT

Код сервера сервера

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 
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 есть удобные асинхронные версии этих функций, но я страх, который выходит за рамки вопроса.

+0

Команда SqlCommand = Новый SqlCommand (queryString, соединение). В этой строке, что такое queryString? – GVillani82

+0

@ Joseph82, я отредактировал ответ, чтобы более точно соответствовать вашему OP. – Jodrell

Смежные вопросы