在C#中调用SQL标量函数usfMGAHolidayCalendar的实现求助
C#调用SQL标量函数完整实现
先修正现有代码的两个核心错误
- 函数名不匹配:SQL中定义的标量函数为
[dbo].[usfMGAHolidayCalendar],你现有代码中调用的usfGetMGAHolidayCalendar多了Get前缀,会触发找不到函数的报错 - 命令对象实例化错误:你现有代码写的
new SqlParameter是参数类的构造方法,应该改为new SqlCommand创建SQL命令对象
完整可运行代码
首先确认你已经引入了必要的命名空间:
using System; using System.Data; using System.Data.SqlClient;
Main方法完整实现:
static void Main(string[] args) { // 替换为你实际的数据库连接字符串 string connString = "Server=你的数据库地址;Database=你的库名;Integrated Security=True;"; // 示例从命令行读取参数,输入格式为:程序名 MGAID 日期(如:xxx.exe 1 2024-10-01) if (args.Length < 2) { Console.WriteLine("参数不足,请按格式输入:程序名 MGAID 日期(示例:xxx.exe 1 2024-10-01)"); return; } // 解析命令行参数 if (!int.TryParse(args[0], out int mgaId) || !DateTime.TryParse(args[1], out DateTime maskDate)) { Console.WriteLine("参数格式错误,MGAID为整数,日期格式为yyyy-MM-dd"); return; } try { using (SqlConnection conn = new SqlConnection(connString)) { // 修正函数名,和SQL定义保持一致 string query = @"SELECT dbo.usfMGAHolidayCalendar(@MGAID, @MaskDate) As NewMaskDate;"; SqlCommand cmd = new SqlCommand(query, conn); cmd.CommandType = CommandType.Text; // 给参数赋值 cmd.Parameters.Add("@MGAID", SqlDbType.Int).Value = mgaId; cmd.Parameters.Add("@MaskDate", SqlDbType.Date).Value = maskDate; // 打开数据库连接 conn.Open(); // 标量函数返回单个值,用ExecuteScalar读取 object result = cmd.ExecuteScalar(); if (result != DBNull.Value) { DateTime newMaskDate = Convert.ToDateTime(result); Console.WriteLine($"计算后的日期为:{newMaskDate:yyyy-MM-dd}"); } else { Console.WriteLine("未获取到有效计算结果"); } } } catch (Exception ex) { Console.WriteLine($"执行出错:{ex.Message}"); } }
关键说明
- 标量函数返回单个值,使用
ExecuteScalar()方法读取效率最高,只会返回查询结果第一行第一列的值 - 如果你的业务场景存在连续3天及以上的节假日,现有SQL函数只做了两次校验,最多支持连续2天节假日跳过,需要适配更长连续假期的话,可以修改SQL函数用循环递归的方式做多次校验
- 生产环境建议把连接字符串写在配置文件中,不要硬编码在业务代码里,方便后续维护修改
内容的提问来源于stack exchange,提问作者Anonymous29
相关产品推荐
相关产品推荐

