将 SQL 定义的函数合并到 C# 代码中:UDF 调用故障排除
在 C# 中实现用户定义的 SQL 函数 (UDF) 时,开发人员可以将这些函数集成到代码中时遇到问题。一个常见的挑战是从 C# 应用程序中正确调用 UDF。
考虑以下场景:开发人员定义了一个名为 Tcupom 的 TSQL 标量函数,用于计算特定订单的总值。为了从 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.直接调用UDF:
直接调用UDF名称,例如SqlCommand对象中的“Tcupom”,是不正确的。要从 C# 调用 UDF,必须将其包含在内联 SQL 语句中。
2. CommandType 错误配置:
代码错误地指定了 CommandType.StoredProcedure,这意味着该函数是存储过程。但是,UDF 是与存储过程不同的实体。
3.缺少数据库范围:
在内联 SQL 语句中,函数名称必须完全符合数据库架构。例如,“SELECT dbo.Tcupom(@code)”。
4。同步调用:
虽然代码似乎通过将结果分配给 SAIDA 来异步执行函数调用,但 ExecuteScalar() 方法本质上是同步的。要执行异步调用,请使用 BeginExecuteReader 或其他异步方法。
更正的代码:
以下更正的代码包含必要的更改:
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 = (float)Totalf.ExecuteScalar(); return SAIDA; }
以上是如何在C#中正确调用SQL用户定义函数(UDF)?的详细内容。更多信息请关注PHP中文网其他相关文章!