【问题标题】:Converting a Value to NULL on server side in c#在 C# 中的服务器端将值转换为 NULL
【发布时间】:2013-12-19 12:06:03
【问题描述】:

我有一个使用存储过程填充网格的方法。 SP 从数据库表中获取数据,但其中一列将日期显示为“01/01/1754 00:00:00”。我希望这个值在网格上显示为 NULL。

我该怎么做?

这是我调用 SP 的代码,我需要某种 IF 语句吗?

public static DataTable getUserList()
{
    SqlConnection con = getConnection();
    SqlCommand cmd = new SqlCommand("PrepaidUserList", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = Convert.ToInt32(ConfigurationManager.AppSettings["SqlTimeout"]);

    cmd.Parameters.AddWithValue("@ApplicationName", Membership.ApplicationName);

    DataSet ds = new DataSet();
    SqlDataAdapter dad = new SqlDataAdapter(cmd);

    try
    {
        con.Open();
        dad.Fill(ds);
    }
    finally
    {
        con.Close();
    }

    return ds.Tables[0];
}

谢谢

【问题讨论】:

  • 在不否认您有充分的理由使用最小日期的情况下,您是否考虑过重构事物以正确使用 NULL,而不是首先插入错误的误导性数据?
  • 我无法更改数据库表,因为它可能会影响应用程序的其他部分。我只是在进行更改,以便更易于阅读...

标签: c# sql sql-server stored-procedures datagrid


【解决方案1】:

一种选择是使用RowDataBound 事件。由于每行数据都绑定到网格,因此您可以修改网格中每个单元格的内容。

在您的情况下,您将检查日期列的值并检查它是否与常量值“01/01/1754 00:00:00”匹配,如果它确实将单元格内容文本设置为“Null” (或任何你想要的)。

所以使用上面链接中的一个例子:

protected void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      if (e.Row.Cells[1].Text == "01/01/1754 00:00:00")
      {
          e.Row.Cells[1].Text = "Null";
      }
    }
  }

有更好的方法可以做到这一点,例如,我认为您可以使用列名而不是索引器。还将日期移动到未硬编码到方法中的常量值。

注意还要注意硬编码日期值的危险,如果您部署到具有不同日期格式(区域设置)的机器,您的常量值可能无效日期格式会出现。

这个link 也应该对你有所帮助。

【讨论】:

  • 感谢您的帮助,但我无法创建新方法,我需要将代码放入我发布的方法中。因此,它会检查数据集中的每一行是否为“01/01/1754 00:00:00”,然后将其替换为“NULL”
  • 那么我相信您唯一的选择(据我所知)是遍历 dt.Tables[0] 中的每一行,进行必要的检查并将其插入新的数据表(见stackoverflow.com/questions/1042618/…)。然后您可以返回新的数据表。
  • 如果你能发布它真的很有帮助,我已经尝试遍历每一行,但我不断收到错误。再次感谢您的帮助...
  • 不用担心创建新的数据表,只需在返回之前对其进行编辑,代码示例请参见此处接受的答案 (stackoverflow.com/questions/17338639/…)。
【解决方案2】:

您有 2 个选项第一个是停止在数据库中输入此类日期,另一个是请更改过程并使用 CASE WHEN DateColumn='01/01/1754 00:00:00' 然后 NULL ELSE DateColumn END

【讨论】:

  • 我无法更改存储过程,因为它可能会影响应用程序的其他部分。我只是在进行更改,以便更易于阅读...
  • 那么您需要在网格视图列中进行更改,例如
猜你喜欢
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多