2010-01-15 58 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. 
*/