在C#中检测此参数差异
问题描述:
以下是我可以在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