2014-09-29 2 views
-1

Попытка (нерабочее) решение включено ниже. У меня есть функция под названием SQL get_parameter, которая выглядит в таблице для данной строки и возвращает соответствующую строку:Получение строкового значения из функции SQL внутри CLR

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; 
     } 
    } 

Однако это не работает. Он постоянно думает, что значение для cnt равно null (или пустое), когда оно возвращается с get_parameter.

В соответствии с просьбой, код для 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 

Я попробовал решение в соответствии с Майком Динеску ниже, но проблема в том, что вызов ExecuteScalar() по-прежнему возвращает нуль. Я стараюсь, чтобы изменить 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

Возможно, вы сравниваете яблоки с апельсинами? Ваша SQL-функция не выполняет точно так же, как ваш ручной скрипт. 'EXEC get_parameter 'filecount'' не совпадает с' SET ... = dbo.get_parameter (' filecount ') '. – stakx

+2

Вы сказали, что это функция, но в вашей CLR, которую вы вызываете как процедура. Измените свой код CLR на «Выберите dbo.get_parameter ('filecount')« –

+0

Покажите нам определение 'dbo.get_parameter'. По крайней мере, заголовок, если не весь организм. – RBarryYoung

ответ

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(); 
+0

Не распознает CommandType.StoredProcedure, хотя я использую System.Data.SqlClient, также не распознает новый SqlCommandParameter() – elbillaf

+0

NVM. Добавление с использованием System.Data исправлено с обеих сторон. – elbillaf

+0

Все еще не работает. Нет сообщений об ошибках. Просто не работает. – elbillaf

Смежные вопросы