【问题标题】:pass null parameter to SQL server query将空参数传递给 SQL Server 查询
【发布时间】:2009-07-07 19:10:38
【问题描述】:

如何将空参数传递给 SQL 服务器查询。 我有一个可以为空的 int 列的简单表。 如果我传递一个 .NET 空值,我会收到一个 sql 错误。如果我通过 DBNull.Value,没有行匹配过滤器。有没有不使用 ISNULL 的简单方法。

    OleDbConnection connection = new OleDbConnection();
    connection.ConnectionString = ...;
    connection.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = connection;
    cmd.CommandText = "select * from myTable where myColumn = ?";
    OleDbParameter parameter = cmd.Parameters.Add(null, OleDbType.Integer);
    parameter.DbType = System.Data.DbType.Int32 ;
    parameter.IsNullable = true;
    parameter.Value = DBNull.Value; // no row returned
    parameter.Value = null; // sql error
    var reader = cmd.ExecuteReader();
...

【问题讨论】:

    标签: sql sql-server oledb oledbparameter


    【解决方案1】:

    由于 NULL 不匹配任何内容(即使 NULL = NULL 为假),您别无选择,只能使用 IS NULL 语句。

    【讨论】:

      【解决方案2】:

      正如 ocdecio 所提到的,NULL 不等于它自己。但你确实有另一种选择。如果您在这种情况下担心 NULL,您可以在参数值中放入一个空字符串,然后像这样编写查询本身:

      select * from myTable where COALESCE(myColumn,'') = ?
      

      【讨论】:

      • 不完全正确 - 空未知字符串和零长度的已知值之间存在差异
      【解决方案3】:

      在 SQL 中,null 与其他值的行为有点不同 - 您不能只将事物评估为 is = null,因为这实际上不起作用,您需要改用“myColumn is null”。

      在您的情况下,当您需要匹配值或空值时,您可能需要在 where 子句中使用 case 语句。

      一点阅读:wikipedia

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多