How to use SQL user defined functions in .NET?

前端 未结 2 1379
广开言路
广开言路 2020-12-10 06:24

I created a scalar function in the DB

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_GetUserId_Username]
    (
    @Username varch         


        
相关标签:
2条回答
  • 2020-12-10 06:43

    This is very similar to the above answer, but the below code allows you to call a UDF with any number of parameters and any return type. This might be useful as a more general solution. This also hasn't been tested thoroughly...I think it will have some problems with varchars.

    public class MyDBAccess
    {
        private SqlConnection sqlConnection = new SqlConnection("databaseconnectionstring");
    
        public int GetUserIdByUsername(string username)
        {
            int userID = CallUDF<int>("dbo.fn_GetUserId_Username", new SqlParameter("@Username", username));
            return userID;
        }
    
        internal static T1 CallUDF<T1>(string strUDFName, params SqlParameter[] aspParameters)
        {
            using (SqlConnection scnConnection = sqlConnection)
            using (SqlCommand scmdCommand = new SqlCommand(strUDFName, scnConnection))
            {
                scmdCommand.CommandType = CommandType.StoredProcedure;
    
                scmdCommand.Parameters.Add("@ReturnValue", TypeToSqlDbType<T1>()).Direction = ParameterDirection.ReturnValue;
                scmdCommand.Parameters.AddRange(aspParameters);
    
                scmdCommand.ExecuteScalar();
    
                return (T1)scmdCommand.Parameters["@ReturnValue"].Value;
            }
        }
    
        private SqlDbType TypeToSqlDbType<T1>()
        {
            if (typeof(T1) == typeof(bool))
            {
                return SqlDbType.Bit;
            }
            else if (typeof(T1) == typeof(int))
            {
                return SqlDbType.Int;
            }
            //
            // ... add more types here
            //
            else
            {
                throw new ArgumentException("No mapping from type T1 to a SQL data type defined.");
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-10 06:45

    It sounds like the right way in this case is to use the functionality of the entity framework to define a .NET function and map that to your UDF, but I think I see why you don't get the result you expect when you use ADO.NET to do it -- you're telling it you're calling a stored procedure, but you're really calling a function.

    Try this:

    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 
        }
    }
    
    0 讨论(0)
提交回复
热议问题