在我的C#中调用SQL函数

时间:2014-10-16 12:06:47

标签: c# sql

我在SSMS中创建了这个功能。

这是为了创建用于为部门成员生成唯一ID的功能。我们的想法是将从此函数返回的任何内容与从数据库生成的另一个值连接起来。

CREATE FUNCTION [dbo].[ufnLeadingNumberOfZeroes](
    @Value INT, @NumberOfZeroes INT
) 
RETURNS varchar(MAX) 
WITH SCHEMABINDING 
AS 
BEGIN
    DECLARE @ReturnValue varchar(MAX);

    SET @ReturnValue = CONVERT(varchar(MAX), @Value);
    SET @ReturnValue = REPLICATE('0', @NumberOfZeroes - DATALENGTH(@ReturnValue)) + @ReturnValue;

    RETURN (@ReturnValue);
END

我想在我的C#代码中调用它。我已经有了这个:

private void memberID(object sender, EventArgs e)
{
    SqlConnection memberID = new SqlConnection(@"Data Source=EPRAISE-PC;Initial Catalog=master;Integrated Security=True");              
    using (SqlCommand comm = new SqlCommand("dbo.ufnLeadingNumberOfZeroes", memberID))
    {
        comm.CommandType = CommandType.StoredProcedure;

        SqlParameter p1 = new SqlParameter("@Value", SqlDbType.Int);
        // You can call the return value parameter anything, .e.g. "@Result".
        SqlParameter p2 = new SqlParameter("@NumberOfZeroes", SqlDbType.Int);

        p1.Direction = ParameterDirection.Input;
        p2.Direction = ParameterDirection.ReturnValue;

        p1.Value = deptCmbBox;

        comm.Parameters.Add(p1);
        comm.Parameters.Add(p2);

        memberID.Open();
        comm.ExecuteNonQuery();

    }
}

我的代码有什么问题?

2 个答案:

答案 0 :(得分:0)

尝试选择该功能并改为使用ExecuteScalar。

private void memberID(object sender, EventArgs e)
{
    // create a connection
    using (SqlConnection conn = new SqlConnection(@"Data Source=EPRAISE-PC;Initial Catalog=master;Integrated Security=True"))          
    {
        // create a command
        SqlCommand cmd = new SqlCommand("SELECT dbo.ufnLeadingNumberOfZeroes(@Value, @NumberOfZeroes)", conn)

        // create parameters for the command
        SqlParameter value = new SqlParameter("@Value", SqlDbType.Int);
        SqlParameter numberOfZeroes = new SqlParameter("@NumberOfZeroes", SqlDbType.Int);

        // initialise the parameters' values
        value.Value = deptCmbBox;
        numberOfZeroes.Value = 0;

        // add the parameters to the command
        cmd.Parameters.Add(value);
        cmd.Parameters.Add(numberOfZeroes);

        // open the connection
        conn.Open();

        // execute the command and retrieve the result
        string str = cmd.ExecuteScalar();
    }
}

答案 1 :(得分:0)

这里有几个问题。

首先,您似乎尝试将输出参数与SQL UDF一起使用,这是不受支持的。您只能将它们与存储过程一起使用。

此外,您的方法(似乎是一个事件处理程序)实际上并没有对它尝试检索的函数的结果做任何事情。您还没有为p2分配值,正如其他人所指出的那样,您的数据类型错误(int而不是bit)。 SQL UDF期望@NumberOfZeroes具有在计算中使用的值。我不确定默认参数值,如果你不给它,但我假设它是NULL,你的函数将返回{{1}如果是这样的话(我只是测试它以确保)。

无论如何,这是我对你认为你想做的事情的解释。阅读评论,您需要考虑几件事情。

注意,我将您尝试做的工作与事件处理程序方法分开。

NULL

我很快就把它撞到了一起,所以我可能遗漏了一些东西,但它应该让你走上正确的道路。