不能为null的整数在传递给存储过程时将变为null

时间:2019-02-13 11:54:26

标签: c# sql .net sql-server ado.net

当我将.NET代码中的整数传递给SQL时,我看到一些非常奇怪的行为。

.NET

int facilityID = 0;
//...
var param = new SqlParameter("@facid", facilityID)
// db call
using (SqlConnection connectionToSQL = new SqlConnection(connectionString))
{
    using (SqlCommand command = new SqlCommand(storedProcedure, connectionToSQL))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.CommandTimeout = commandTimeout;

        command.Parameters.Add(param)

        adapter = new SqlDataAdapter(command);

        connectionToSQL.Open();

        data = new DataSet();
        adapter.Fill(data);
    }
}

SQL

CREATE PROCEDURE MySP @facid int = NULL, 
-- ...
SELECT
-- ...
WHERE       r.entity = isnull(@facid,r.entity) -- r.entity defined as [entity] [numeric] (18, 0) NULL, however it contains only numbers > 0 (no NULLs)

因此,仅当@facid为NULL或某个数字> 0与r.entity值之一匹配时,此select语句才能返回数据,但是,当我运行.NET代码时,它将返回结果。有人可以解释一下这怎么可能吗?尽管我从.NET代码中传递了0,但究竟是什么以及为什么它使@ facid = NULL呢?

.NET 4.5

System.Data版本4.0.0.0

Microsoft SQL Server 2008 R2(SP3-GDR)(KB4057113)-10.50.6560.0(X64)2017年12月28日15:03:48(c)Windows NT 6.1(Build)上的Microsoft Corporation Developer Edition(64位)版权所有(c) 7601:Service Pack 1)(管理程序)

0 个答案:

没有答案