当前位置: 首页 > 面试题库 >

如何在.NET中使用SQL用户定义的函数?

蒋岳
2023-03-14
问题内容

我在数据库中创建了标量函数

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_GetUserId_Username]
    (
    @Username varchar(32)
    )
RETURNS int
AS
    BEGIN
    DECLARE @UserId int
    SELECT @UserId = UserId FROM [User] WHERE Username = @Username
    RETURN @UserId
    END

现在,我想在.NET C#或VB.NET代码中运行它。

我使用实体框架,尝试使用功能映射对其进行映射,但未成功。我不在乎用简单的DbCommand来做到这一点,问题是我没有得到任何结果(该函数存在于Entities类中):

public int GetUserIdByUsername(string username)
{
    EntityConnection connection = (EntityConnection)Connection;            
    DbCommand com = connection.StoreConnection.CreateCommand();
    com.CommandText = "fn_GetUserId_Username";
    com.CommandType = CommandType.StoredProcedure;
    com.Parameters.Add(new SqlParameter("Username", username));
    if (com.Connection.State == ConnectionState.Closed) com.Connection.Open();
    try
    {
        var result = com.ExecuteScalar(); //always null
    }
    catch (Exception e)
    { 
    }
    return result;
}

有什么解决办法吗?欢迎使用C#或VB.NET发布。


问题答案:

在这种情况下,听起来 正确的
方法是使用实​​体框架的功能来定义.NET函数并将其映射到您的UDF,但是我想我明白为什么您在使用ADO时没有得到预期的结果.NET做到这一点-
您正在告诉它您正在调用存储过程,但实际上是在调用函数。

试试这个:

public int GetUserIdByUsername(string username)
{
    EntityConnection connection = (EntityConnection)Connection;            
    DbCommand com = connection.StoreConnection.CreateCommand();
    com.CommandText = "select dbo.fn_GetUserId_Username(@Username)";
    com.CommandType = CommandType.Text;
    com.Parameters.Add(new SqlParameter("@Username", username));
    if (com.Connection.State == ConnectionState.Closed) com.Connection.Open();
    try
    {
        var result = com.ExecuteScalar(); // should properly get your value
        return (int)result;
    }
    catch (Exception e)
    {
        // either put some exception-handling code here or remove the catch 
        //   block and let the exception bubble out 
    }
}


 类似资料:
  • 我知道如何在SparkSQL中编写UDF: 我可以做类似的事情来定义聚合函数吗?这是怎么做到的? 对于上下文,我想运行以下SQL查询: 它应该会返回类似于 我希望聚合函数告诉我,在由< code>span和< code>timestamp定义的组中,是否有任何< code>opticalReceivePower的值低于阈值。我需要把我的UDAF写得和我上面粘贴的UDF不同吗?

  • 问题内容: 我只想执行以下Mysql语句 与MySql.Data.MySqlClient 我收到一个致命错误。 当我用任一替换$ sql时 要么 我得到了预期的结果。 我找到了这个问题,但是并不能解决我的问题。 我正在尝试将SQLIse(SQLPSX项目的一部分)移植到MySQL版本MySQLIse。 我想处理任何简单的有效mysql语句。 编辑: 我正在尝试运行sakila- schema.sq

  • 在本节中,将了解SQL Server用户定义的函数,包括返回单个值的标量值函数和返回数据行的表值函数。 SQL Server用户定义的函数通过封装复杂的业务逻辑并使其可在每个查询中重用,以简化开发。 用户定义的标量函数 - 涵盖用户定义的标量函数,用于封装复杂的公式或业务逻辑,并在每个查询中重用它们。 表变量 - 学习如何使用表变量作为用户定义函数的返回值。 表值函数 - 介绍内联表值函数和多语句

  • 问题内容: 我了解T-SQL不是面向对象的。我需要编写一组函数来模拟C#中的方法重载。 T-SQL是否以任何方式支持函数重载?如果有这样做的技巧,是否建议这样做? 问题答案: 不,没有办法做到这一点。 我建议您重新考虑该要求,因为“使苹果看起来像橘子”通常很难做到,而且价值可疑。

  • 问题内容: 我想在SQL Server中创建调用函数,该函数接收两个参数并返回一个整数。当我调用存储过程时,我使用以下代码: 在这种情况下,我有一个由存储过程返回的表。如果我想使用返回标量值的函数而不是存储过程,会有什么变化? 问题答案: 您不能直接调用该函数,只是,( 查询 ),并且是允许的。由于您已经接触过存储过程,因此为什么不创建一个具有该功能的过程呢? 在您的C#代码中,您可以使用命令对象

  • 问题内容: 使用SQLite,可以使用C api 或PHP轻松添加用户定义的SQL函数。但是也可以使用Java或Groovy吗? 问题答案: 事实证明,使用SQLiteJDBC编写用户定义的函数实际上非常容易。这是一个Groovy示例: