【问题标题】:Month and Date stored the wrong way around in ASP to SQL Server月份和日期在 ASP 中以错误的方式存储到 SQL Server
【发布时间】:2017-06-05 11:56:19
【问题描述】:

我正在创建一个 C# ASP 页面,该页面获取用户在文本框中设置的日期(日期是使用日历对象选择的,然后发送到文本框)并将它们保存到 SQL 服务器。输入日期后,它将它们存储在 MM-DD-YYYY 而不是 DD-MM-YYYY 中。这显然会产生错误!谁能帮我获取日期以我想要的格式存储它们?

protected void Page_Load(object sender, EventArgs e)
{

    if (!Page.IsPostBack)
    {
        DateTime today = DateTime.Now;
        DateTime sevenDays = today.AddDays(7);
        btnDelete.Enabled = false;
        txtStart.Text = today.ToShortDateString();
        txtEnd.Text = sevenDays.ToShortDateString();
    }
    updateGrid();
}
protected void btnSave_Click(object sender, EventArgs e)
{
    if (sqlCon.State == System.Data.ConnectionState.Closed)
        sqlCon.Open();
    SqlCommand sqlCmd = new SqlCommand("MessageUpdateOrCreate", sqlCon);
    sqlCmd.CommandType = System.Data.CommandType.StoredProcedure;
    sqlCmd.Parameters.AddWithValue("@MessageID", (hfMessageID.Value == "" ? 0 : Convert.ToInt32(hfMessageID.Value)));
    sqlCmd.Parameters.AddWithValue("@Sender", txtSender.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Receiver", txtReceiver.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Message", txtMessage.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Yeargroup", ddYear.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Title", txtTitle.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Date", txtStart.Text.Trim());
    sqlCmd.Parameters.AddWithValue("@Expiry", txtEnd.Text.Trim());

    sqlCmd.ExecuteNonQuery();
    sqlCon.Close();
    string messageID = hfMessageID.Value;
    clear();

    if (messageID == "")
        lblSuccess.Text = "New message Success";
    else
        lblSuccess.Text = "Updated Success";
    updateGrid();
}

【问题讨论】:

  • SQL Server 中的字段数据类型是什么?
  • 如果您的字段类型是日期,那么您不会将它们存储为 MM-DD-YYYY 或 DD-MM-YYYY 格式,而是将它们存储为内部二进制(数字)格式。 MM-DD-YYYY 或 DD-MM-YYYY 格式在您呈现数据时由您的应用程序(您的数据组件配置)应用。
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...

标签: c# asp.net sql-server date


【解决方案1】:

你的问题是这两行:

sqlCmd.Parameters.AddWithValue("@Date", txtStart.Text.Trim());
sqlCmd.Parameters.AddWithValue("@Expiry", txtEnd.Text.Trim());

您正在将字符串传递给几乎可以肯定需要日期的存储过程。这意味着字符串将以您无法控制的方式转换为日期。

所以你需要控制。您需要以您需要的方式解析日期(例如 dd/mm/yyyy 或 mm/dd/yyyy)。这些链接将帮助您:

将字符串解析为日期后:

  1. 检查日期结果是否符合您的预期
  2. 将该日期(而不是现有字符串)传递给存储过程

【讨论】:

  • 并使用显式参数类型而不是AddWithValue
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多