2010-01-15 77 views
4

以下是我可以在StoredProcedure中聲明參數的方式。在C#中檢測此參數差異

@Doc_Type_Id int 

@Doc_Type_ID int=null 

二實施表明,該參數是可選。

使用

SqlCommandBuilder.DeriveParameters(cmd); 

現在我動態檢測參數我怎樣才能區分這兩種類型的參數之間。兩者的ParameterDirection僅爲Input。請建議。

回答

1

我不認爲你能分辨出差異。是否有您需要的特定原因?

我的主要回應是,真的要看看您是否真的需要使用SqlCommandBuilder來爲這樣的存儲過程派生參數?原因在於,由於需要往返數據庫才能獲取此信息,因此您會受到性能影響。

+0

是的,我明白,有一個性能命中。我需要它,因爲我正在維護一個應用程序。現在我正在使用數據訪問塊中的SqlHelper.cs。我已經將這個新參數添加到storedProcedure並將其設置爲null。如果我們使用普通的命令和連接對象,它將工作正常。但在這種情況下,會出現參數不匹配,因爲SqlCommandBuilder.DeriveParameters(cmd)的參數計數爲4,並嘗試爲其分配值,但DAL中的已編碼函數只有3個參數。 – Rohit 2010-01-15 08:26:18

0

我試圖創建SQL Server中的SP現在2005

alter PROCEDURE test 
(
    @no INT, 
    @id INT=0 
) 
AS 
BEGIN 
    SET @id=5 
    PRINT @id 
END 

當我使用這個查詢

SELECT * FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME='test' 

的結果是相同的兩個參數

如果我使用不同的查詢

SELECT 
    p.name,  
    pm.parameter_id, 
    pm.name AS parameter_name, 
    pm.has_default_value, 
    pm.default_value 
FROM sys.procedures p 
    JOIN sys.parameters pm ON p.object_id = pm.object_id 
    JOIN sys.types t ON pm.system_type_id = t.system_type_id 
WHERE p.name = 'test' 

結果是一樣的從

pm.has_default_value, 
pm.default_value 

我想即使SQL Server不知道這種差異。

0

使用SET FMTONLY ON可以在不修改數據或返回行的情況下驗證參數值。然後對每個參數執行一次程序,同時將其值設置爲DEFAULT,將所有其他值設置爲NULL。對於可由catch塊處理的每個非可選參數,都會返回一個異常。

CREATE PROC GetContacts(@name int = NULL, @phone int, @email int) 
AS RETURN 
GO 

SET FMTONLY ON 
EXEC GetContacts DEFAULT, null, null 
EXEC GetContacts null, DEFAULT, null 
EXEC GetContacts null, null, DEFAULT 
SET FMTONLY OFF 
GO 

/* 
-- Results 
Msg 201, Level 16, State 4, Procedure GetContacts, Line 0 
Procedure or function 'GetContacts' expects parameter '@phone', which was not supplied. 
Msg 201, Level 16, State 4, Procedure GetContacts, Line 0 
Procedure or function 'GetContacts' expects parameter '@email', which was not supplied. 
*/