如何将 Nullable Bit 类型值传递给 SQL Server 存储过程?

Els*_*han 6 c# sql-server

我想将null值传递给 where 子句 bit类型变量以获取表中的所有行。而且当我通过时truefalsewhere 子句应该起作用才能做到这一点。

错误:

无法确定条件表达式的类型,因为 'bool?' 之间没有隐式转换 和“System.DBNull”

存储过程:

CREATE PROCEDURE [dbo].[SelectAllUIDs] 
    @enable bit
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        [UID], [fEnable] [Enable],
        [AddedDate] [Added Date]
    FROM 
        [VehicleService].[dbo].[NFCCard] 
    WHERE
        fEnable = @enable OR fEnable IS NOT NULL
    ORDER BY 
        NfcKy
END
Run Code Online (Sandbox Code Playgroud)

C#代码:

 public DataSet SelectUid(bool? status)
 {
        DataSet ds = new DataSet();

        try
        {
            SqlCommand com = new SqlCommand("SelectAllUIDs", con);
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.Add(new SqlParameter("@enable", SqlDbType.Bit)
                                   { Value = status != null ? status : DBNull.Value });

            SqlDataAdapter adp = new SqlDataAdapter(com);
            adp.Fill(ds);
        }
        catch (Exception ex)
        {
            ds = null;
            throw ex;
        }
        return ds;
    }
Run Code Online (Sandbox Code Playgroud)

呼叫:

DataSet ds = SelectUid(null); // should return all rows

DataSet ds = SelectUid(true); // should return fEnable = true rows

DataSet ds = SelectUid(false); // should return fEnable = false rows
Run Code Online (Sandbox Code Playgroud)

And*_*mar 3

当状态为 时,您可以使用运算??null提供替代方案。就像@user2864740评论的那样,双方都必须是兼容的类型。这是行不通的:

var x = true ?? DBNull.Value;  // "no implicit conversion" error
Run Code Online (Sandbox Code Playgroud)

的左手值??是 a bool,但右手值不是。因此编译器会抱怨DBNull.Value不能“隐式转换”为bool. 要解决此问题,请将左侧转换为object

var x = (object) true ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

现在??将计算为一个对象,该对象可以包含 abool和 a DNull.Value。将其应用于您的问题,您会得到:

com.Parameters.AddWithValue("@parname", (object) status ?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)