2014-09-29 39 views
-1

嘗試(非工作)解決方案包含在下面。 我有一個SQL函數調用GET_PARAMETER看起來在表中給定的字符串,返回相關的字符串:從CLR中的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; 
     } 
    } 

但是,這是行不通的。它始終認爲cnt的值在從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 2014-09-29 18:24:06

+2

你說這是一個函數,但是在你的CLR中,你像一個程序調用。將您的CLR代碼更改爲「選擇dbo.get_parameter('filecount')」 – 2014-09-29 18:24:23

+0

向我們顯示'dbo.get_parameter'的定義。至少頭部,如果不是整個身體。 – RBarryYoung 2014-09-29 18:25:08

回答

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

即使我使用System.Data.SqlClient,也無法識別CommandType.StoredProcedure,也無法識別新的SqlCommandParameter() – elbillaf 2014-09-29 18:34:09

+0

NVM。使用System.Data添加固定這兩個。 – elbillaf 2014-09-29 18:43:31

+0

仍然無法使用。沒有錯誤消息。只是不行。 – elbillaf 2014-09-30 11:56:40