Chiamata SQL funzione Definita in C#

Ho scritto questa funzione scalare in TSQL:

create function TCupom (@cupom int)
returns float
as
begin
    declare @Tcu float;

    select @Tcu = sum (total) from alteraca2 where pedido = @cupom 

    if (@tcu is  null)
        set @tcu = 0;

    return @tcu;
end

Voglio chiamare questa funzione nel mio codice C#. Ecco ciò che ho finora:

public void TotalCupom(int cupom)
{ 
    float SAIDA;           
    SqlDataAdapter da2 = new SqlDataAdapter();

    if (conex1.State == ConnectionState.Closed)
    { 
        conex1.Open();
    }

    SqlCommand Totalf = new SqlCommand("Tcupom", conex1);
    SqlParameter code1 = new SqlParameter("@code", SqlDbType.Int);
    code1.Value = cupom ;
    Totalf.CommandType = CommandType.StoredProcedure ;
    SAIDA = Totalf.ExecuteScalar();

    return SAIDA;
}



3 Replies
  1. 40

    Non si può semplicemente chiamare il nome di funzione, sarà necessario scrivere un inline istruzione SQL che fa uso di UDF:

    SqlCommand Totalf = new SqlCommand("SELECT dbo.Tcupom(@code)", conex1);

    E rimuovere il CommandType, questa non è una Stored Procedure, è una Funzione Definita dall’Utente.

    A tutti:

    public void TotalCupom(int cupom)
    { 
        float SAIDA;           
        SqlDataAdapter da2 = new SqlDataAdapter();
        if (conex1.State == ConnectionState.Closed)
        {
            conex1.Open();
        }
        SqlCommand Totalf = new SqlCommand("SELECT dbo.Tcupom(@code)", conex1);
        SqlParameter code1 = new SqlParameter("@code", SqlDbType.Int);
        code1.Value = cupom;
        SAIDA = Totalf.ExecuteScalar();
    
        return SAIDA;
    }
    • Perché in realtà lui ha fatto Totalf.CommandType = CommandType.StoredProcedure egli può solo chiamare il nome della funzione.
    • Sei sicuro? Che cosa se ci fosse una stored procedure chiamato Tcupom? Sicuramente SQL Server ottenere confuso…
    • No, hai ragione, ho appena realizzato che stava usando una funzione scalare, non è una tabella in base alla funzione. Non so se coloro che possono essere chiamati via SqlCommand impostato come StoredProcedure
    • Ci dispiace che ancora non mi ha convinto. Questo articolo fa riferimento a “Utilizzo di Parametri con un SqlCommand e una Stored Procedure”, si menziona nulla di Funzioni Definite dall’Utente.
    • Ad essere onesti non ho ancora capito come dovrebbe funzionare con una tabella in base UDF. Sarei interessato a vedere un po ‘ di documentazione.
    • Aggiorna la tua pagina, sono d’accordo con te ora.
    • numero di correzioni: 1. il metodo ha un valore di ritorno void e, si restituisce qualcosa d’altro (ritorno SAIDA;) 2. devi inizializzare un SqlDataAdapter e non è mai utilizzato. 3. ExecuteScalar(); restituisce un oggetto, bisogni di conversione di tipo.
    • Si è correttamente originally. Si può la chiamata di una funzione scalare con CommandType.StoredProcedure e senza una confezione select.
    • Ha bisogno di molte correzioni e dopo tutto, non il suo lavoro: SqlDataAdapter da2 = new SqlDataAdapter(); mai usato? SqlParameter codice1 = new SqlParameter(“@code”, SqlDbType.Int); mai usato?

  2. 3
    ...
    
    try
    {
        if (connectionState != ConnectionState.Open)
            conn.Open();
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "udfName";
            cmd.CommandType = CommandType.StoredProcedure;
    
            foreach (var cmdParam in sqlParams)
            {
                cmd.Parameters.Add(cmdParam);
            }
    
    
            var retValParam = new SqlParameter("RetVal", SqlDbType.Int)
            {
                //Set this property as return value
                Direction = ParameterDirection.ReturnValue 
            };
    
            cmd.Parameters.Add(retValParam);
            cmd.ExecuteScalar();
    
            retVal = retValParam.Value;
        }
    }
    finally
    {
        if (connectionState == ConnectionState.Open)
            conn.Close();
    }
    
    ...
  3. 1

    Ho voluto chiamare una Funzione SQL nello stesso modo in cui l’ho chiamata di Stored Procedure utilizzando DeriveParameters e quindi impostare i valori dei parametri. Si scopre che questo funziona con le Funzioni Scalari fuori dalla scatola e si può utilizzare il metodo ExecuteNonQuery e leggere il RETURN_VALUE. Si prega di vedere il codice di esempio qui di seguito:

        public int GetLookupCodeFromShortCode(short tableType, string shortCode)
        {
            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString))
            {
                conn.Open();
    
                using (var cmd = new SqlCommand("dbo.fnGetLookupCodeFromShortCode", conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandTimeout = 30;
                    SqlCommandBuilder.DeriveParameters(cmd);
    
                    cmd.Parameters["@sintTableType"].Value = tableType;
                    cmd.Parameters["@vchrShortCode"].Value = shortCode;
                    cmd.Parameters["@chrLanguage"].Value = "en";
                    cmd.Parameters["@chrCountry"].Value = "en";
    
                    cmd.ExecuteNonQuery();
    
                    return (int)cmd.Parameters["@RETURN_VALUE"].Value;
                }
            }
    
        }

    La Funzione Scalare codice simile a questo:

    CREATE FUNCTION [dbo].[fnGetLookupCodeFromShortCode]( @sintTableType SMALLINT, @vchrShortCode VARCHAR(5), @chrLanguage CHAR(2), @chrCountry CHAR(2))
    
    RETURNS INT
    
    AS
    
    BEGIN
    
        DECLARE @intLookupCode  INT
    
        SELECT @intLookupCode = LV.intLookupCode 
        FROM    
        tblLookupValueDesc LVD
            INNER JOIN tblLookupValue LV ON LV.sintLookupTableType = LVD.sintLookupTableType AND LV.intTableKey = LVD.intTableKey
        WHERE   
        LVD.sintLookupTableType = @sintTableType
        AND LVD.vchrShortCode = @vchrShortCode
        AND LVD.chrCountry = @chrCountry
        AND LVD.chrLanguage = @chrLanguage
    
        RETURN @intLookupCode 
    
    END
    
    GO

Lascia un commento