下面包含的尝试(非工作)解决方案。 我有一个名为get_parameter的sql函数,它在表中查找给定的字符串并返回关联的字符串:
declare @str varchar(20);
set @str = dbo.get_parameter('filecount')
print @str
有效!我运行它,它打印出它应该打印的确切内容。在这种情况下,参数是字符串' 44'。
现在我想运行一个C#CLR。但是我希望CLR能够查找它需要的参数。
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static string Import_TestFunc()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlCommand command = new SqlCommand();
command.Connection = conn;
conn.Open();
// Find out how many files DSAMS processing requires.
command.CommandText = @"EXEC get_parameter 'filecount' ";
string cnt = (string)command.ExecuteScalar();
if (String.IsNullOrEmpty(cnt))
{
return "'cnt' not found."; // error return code. can't find this parameter.
}
return cnt;
}
}
然而,这不起作用。它一直认为当从get_parameter返回时,cnt的值为null(或为空)。
根据要求,get_parameter的代码
ALTER FUNCTION [dbo].[get_parameter]
(
@SelectedParameterName nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @result nvarchar(max);
SET @result = (SELECT ParameterValue from Parameters WHERE ParameterName = @SelectedParameterName);
RETURN isnull(@result,'');
END
我已经按照下面的Mike Dinescu尝试了解决方案,但问题是对ExecuteScalar()的调用仍然返回null。我确实尝试更改为CommandType.Text,在这种情况下,我得到以下有趣的消息:
A .NET Framework error occurred during execution of user-defined routine or aggregate "Import_TestFunc":
System.Data.SqlClient.SqlException: Procedure or function 'get_parameter' expects parameter '@SelectedParameterName', which was not supplied.
这很有趣,因为我正在寻找添加参数@SelectedParameterName的位置。
command.Parameters.Add(new SqlParameter("@SelectedParameterName", SqlDbType.NVarChar )).Value = "filecount";
答案 0 :(得分:1)
如果要从.NET执行用户定义的函数或存储过程,则应将CommandType设置为CommandType.StoredProcedure,并在执行命令之前将所需的参数添加到命令对象。
command.CommandType = CommandType.StoredProcedure;
command.CommandText = @"dbo.get_parameter";
// here you add the paramters needed for your procedure/function
// in your case it will be just one (make sure you add the correct name for you function)
command.Parameters.Add(new SqlParamter("SelectedParameterName", SqlDbType.NVarChar));
command.Prepare();
command.Parameters[0].Value = "filecount";
string cnt = (string)command.ExecuteScalar();