복붙노트

[SQL] C #에서 호출 SQL 정의 기능

SQL

C #에서 호출 SQL 정의 기능

나는 SQL이 스칼라 함수를 작성했습니다 :

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

내 C # 코드에서이 함수를 호출하고 싶습니다. 여기에 지금까지 가지고 무엇을 :

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;
}

해결법

  1. ==============================

    1.당신은 단지 함수 이름을 호출 할 수 없습니다, 당신은 UDF를 사용합니다 인라인 SQL 문을 작성해야합니다 :

    당신은 단지 함수 이름을 호출 할 수 없습니다, 당신은 UDF를 사용합니다 인라인 SQL 문을 작성해야합니다 :

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

    그리고,이 저장 프로 시저 아니라, 자사의 사용자 정의 함수를 CommandType을 제거합니다.

    모두 :

    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;
    }
    
  2. ==============================

    2.나는 DeriveParameters를 사용하여 다음 매개 변수 값을 설정하는 것입니다 내가 저장 프로 시저를 호출하는 것과 같은 방법으로 SQL 함수를 호출하고 싶었다. 그것은 상자 밖으로 스칼라 기능이이 작품을 밝혀 당신은 ExecuteNonQuery는을 사용하고 RETURN_VALUE를 읽을 수 있습니다. 아래의 샘플 코드를 참조하십시오 :

    나는 DeriveParameters를 사용하여 다음 매개 변수 값을 설정하는 것입니다 내가 저장 프로 시저를 호출하는 것과 같은 방법으로 SQL 함수를 호출하고 싶었다. 그것은 상자 밖으로 스칼라 기능이이 작품을 밝혀 당신은 ExecuteNonQuery는을 사용하고 RETURN_VALUE를 읽을 수 있습니다. 아래의 샘플 코드를 참조하십시오 :

        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;
                }
            }
    
        }
    

    이 같은 스칼라 기능 코드 외모 :

    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
    
  3. ==============================

    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();
    }
    
    ...
    
  4. from https://stackoverflow.com/questions/17047057/calling-sql-defined-function-in-c-sharp by cc-by-sa and MIT license