以下是我可以在StoredProcedure中聲明參數的方式。在C#中檢測此參數差異
@Doc_Type_Id int
和
@Doc_Type_ID int=null
二實施表明,該參數是可選。
使用
SqlCommandBuilder.DeriveParameters(cmd);
現在我動態檢測參數我怎樣才能區分這兩種類型的參數之間。兩者的ParameterDirection僅爲Input。請建議。
以下是我可以在StoredProcedure中聲明參數的方式。在C#中檢測此參數差異
@Doc_Type_Id int
和
@Doc_Type_ID int=null
二實施表明,該參數是可選。
使用
SqlCommandBuilder.DeriveParameters(cmd);
現在我動態檢測參數我怎樣才能區分這兩種類型的參數之間。兩者的ParameterDirection僅爲Input。請建議。
我不認爲你能分辨出差異。是否有您需要的特定原因?
我的主要回應是,真的要看看您是否真的需要使用SqlCommandBuilder來爲這樣的存儲過程派生參數?原因在於,由於需要往返數據庫才能獲取此信息,因此您會受到性能影響。
你可以通過調用得到paramater列表:
SELECT * FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME = 'yourSPnameHere'
,但我認爲這個鏈接可以真正幫助您
http://www.codeproject.com/KB/database/FindDefaultValueSPParams.aspx
我想這可能是有用的。
我試圖創建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不知道這種差異。
使用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.
*/
是的,我明白,有一個性能命中。我需要它,因爲我正在維護一個應用程序。現在我正在使用數據訪問塊中的SqlHelper.cs。我已經將這個新參數添加到storedProcedure並將其設置爲null。如果我們使用普通的命令和連接對象,它將工作正常。但在這種情況下,會出現參數不匹配,因爲SqlCommandBuilder.DeriveParameters(cmd)的參數計數爲4,並嘗試爲其分配值,但DAL中的已編碼函數只有3個參數。 – Rohit 2010-01-15 08:26:18