我想将null值传递给 where 子句 bit类型变量以获取表中的所有行。而且当我通过时true或falsewhere 子句应该起作用才能做到这一点。
错误:
无法确定条件表达式的类型,因为 '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)
当状态为 时,您可以使用运算??符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)
| 归档时间: |
|
| 查看次数: |
7002 次 |
| 最近记录: |