我在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();
}
}
我的代码有什么问题?
答案 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
我很快就把它撞到了一起,所以我可能遗漏了一些东西,但它应该让你走上正确的道路。