2012-09-11 61 views
2

我希望在SQL Server中創建調用函數,該函數接收兩個參數並返回一個整數。當我打電話的存儲過程,我用下面的代碼:使用ADO調用SQL函數.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

也許你正在尋找[我如何調用從ado.net一個TSQL函數] [1] [1]:http://stackoverflow.com/questions/4145329/how-do- i-call-a-tsql-function-from-ado-net –

+0

@John但我只想重新調整標量值!爲什麼使用存儲過程?你確定我不能直接調用函數嗎? – GVillani82

+0

@Cuong我試着用你的代碼,但沒有返回正確的值。 – GVillani82

回答

5

你不能調用該函數直接,只有StoredProcedureText查詢),和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查詢調用該函數

sql server代碼

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