在 C# 中调用标量函数 [重复]

Posted

技术标签:

【中文标题】在 C# 中调用标量函数 [重复]【英文标题】:Call Scalar function in C# [duplicate] 【发布时间】:2021-11-05 00:39:46 【问题描述】:

我有一个在 sql 中运行良好的标量函数。我需要在 c# 中调用该函数。标量函数如下:

CREATE FUNCTION [dbo].[usfMGAHolidayCalendar](@MGAID INT, @MaskDate DATE)

RETURNS DATE
AS
/*Returns the NewFileMask*/
    BEGIN

        DECLARE @NewMaskDate DATETIME,
                @IsMGAHolidayCalendar INT = 0;

        SET @IsMGAHolidayCalendar =
        (
            SELECT COUNT(HolidayDate)
            FROM xml.MGAHolidayCalendar
            WHERE HolidayDate = @MaskDate
            AND MgaId = @MGAID  
        );

        IF @IsMGAHolidayCalendar > 0
                /*Return @NewMaskDate (@MaskDate + 1)*/
                SET @NewMaskDate = DATEADD(dd, 1,@MaskDate)
        
            ELSE
                /*Return the original @MaskDate as @NewMaskDate*/
                SET @NewMaskDate = @MaskDate

        /*Sometimes there are two holidays in a row (e.g. Thanksgiving & Thanksgiving Friday)*/
        /*Check the table for the NewMaskDate*/
        SET @IsMGAHolidayCalendar =
        (
            SELECT COUNT(HolidayDate)
            FROM xml.MGAHolidayCalendar
            WHERE HolidayDate = @NewMaskDate
            AND MgaId = @MGAID
        );

        IF @IsMGAHolidayCalendar = 1
                /*Return @NewMaskDate (@NewMaskDate + 1)*/
                SET @NewMaskDate = DATEADD(dd, 1,@NewMaskDate)
            ELSE
                /*Return the original @NewMaskDate as @NewMaskDate*/
                SET @NewMaskDate = @NewMaskDate

        RETURN @NewMaskDate;

我开始在 C# 中调用 Scalar 函数,这就是我目前所拥有的。我需要一些指导/帮助来完成它。

//调用dbo.usfGetMGAHolidayCalendar并返回NewMaskDate//

    static void Main(string[] args)
    
        //Set the connection string//

     try
        
            //sql connection object
            using (SqlConnection conn = new SqlConnection(connString))
            
                //define the query text
                string query = @"SELECT dbo.usfGetMGAHolidayCalendar(@MGAID, @MaskDate) As NewMaskDate;";

                //parameter value will be set from command line
                SqlCommand cmd = new SqlParameter("dbo.usfGetMGAHolidayCalendar", conn);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@MGAID", SqlDbType.Int);
                cmd.Parameters.Add("@MaskDate" , SqlDbType.Date);
               

【问题讨论】:

函数不能被调用,只能在查询中使用。这与尝试调用例如 GETDATE() 没有什么不同。 我们之前已经看到过这个功能 - 所以您似乎已经创建了一个新帐户来发布类似的问题。 您好,问题解决了吗? 嘿。项目要求发生了变化。谢谢。 【参考方案1】:

我得到了您的关注,根据您的情况,您可以尝试如下:

SQL 函数:

CREATE FUNCTION CallFunctionFromCSharp (@EmpId INT)
RETURNS INT
AS
BEGIN
    DECLARE @EmpProjectNumber INT;

    SELECT @EmpProjectNumber =  (SELECT WsEmployeeNumber FROM WsEmployee WHERE WsEmployeeId =@EmpId)

    IF (@EmpProjectNumber IS  NULL)
        SET @EmpProjectNumber = 0;

    RETURN @EmpProjectNumber;
END

此函数返回如下数字:

调用 C#

 using (var connection = new SqlConnection("Server=ServerName;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"))
                
                    int employeeId = 1;
                    string projectNumber;
                    connection.Open();
                    var command = connection.CreateCommand();
                    command.CommandText = "SELECT dbo.CallFunctionFromCSharp(@EmpId) AS projectNumber";
                    command.Parameters.AddWithValue("@EmpId", employeeId);
                    SqlDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    
                        projectNumber = reader["projectNumber"].ToString(); // Remember Type Casting is required here it has to be according to database column data type
                      
                    
                    reader.Close();
                    command.Dispose();
                    connection.Close();

                

注意: 你有两个参数,所以你可以这样写:dbo.CallFunctionFromCSharp(@EmpId,@anotherParam) 然后传递 像这样的参数command.Parameters.AddWithValue("@anotherParam", anotherParamValue);

输出:

注意:如果遇到异常,请仔细检查返回类型和参数类型。

希望它能帮助您实现目标。

【讨论】:

以上是关于在 C# 中调用标量函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中调用基本构造函数 [重复]

C# 字符串函数到 T-SQL 标量函数

在 C# 中的类构造函数中调用异步方法 [重复]

在C#后面调用Javascript函数[重复]

避免在 UPDATE 语句中多次调用标量函数

在多标量表值函数中调用存储过程?