如何在C#中仅向数据库插入日期(不含时间)?
解决SQL Server中插入仅日期(不含时间)的问题
首先咱们先理清核心问题:为什么数据库里总是存成2019-10-19 00:00:00.000这种带时间的值?
- 如果你的
departure_date和arrival_date字段类型是DATETIME或DATETIME2,SQL Server会自动为日期补充0点的时间部分——这是这类数据类型的固有特性,它们本身就是用来存储日期+时间的。 - 要是你想存储阶段就只保留日期,需要把数据库字段类型改成
DATE(SQL Server 2008及以上版本支持),这个类型专门用来存日期,完全没有时间部分。
另外必须提醒你:你的代码存在严重的SQL注入风险,直接拼接字符串生成SQL语句是非常危险的操作,必须改用参数化查询。而且参数化查询还能更精准地传递日期类型,避免格式转换带来的各种问题。
下面是修正后的完整代码:
SqlCommand cmd2 = conn.CreateCommand(); cmd2.CommandType = CommandType.Text; // 解析前端输入的日期和时间 DateTime departureDate = DateTime.ParseExact(TextBox_DepartureDate.Text, "dd/MM/yyyy", null); DateTime arrivalDate = DateTime.ParseExact(TextBox_ArrivalDate.Text, "dd/MM/yyyy", null); string departureTimeStr = TextBox_DepartureTime.Text + " " + DropDownListAMPM.SelectedValue; string arrivalTimeStr = TextBox_ArrivalTime.Text + " " + DropDownList_AMPM2.SelectedValue; // 日期合法性校验 if (departureDate.Date <= DateTime.Now.Date) { Label_EditTableMessage.ForeColor = System.Drawing.Color.Red; Label_EditTableMessage.Text = "Departure Date Cannot be in the past"; } else if (arrivalDate.Date <= departureDate.Date) { Label_EditTableMessage.ForeColor = System.Drawing.Color.Red; Label_EditTableMessage.Text = "Return Date Cannot be Less than the Departure Date"; } else { // 使用参数化SQL,彻底避免注入风险 cmd2.CommandText = @"INSERT INTO flight(airline_id, flight_number, numer_seats, departure_city, destination_city, departure_time, arrival_time, departure_date, arrival_date) VALUES (@AirlineId, @FlightNumber, @NumSeats, @DepartureCity, @DestinationCity, @DepartureTime, @ArrivalTime, @DepartureDate, @ArrivalDate)"; // 逐一添加参数,确保类型匹配 cmd2.Parameters.AddWithValue("@AirlineId", DropDownList_AirlineId.SelectedValue); cmd2.Parameters.AddWithValue("@FlightNumber", TextBox_FlightNumber.Text); cmd2.Parameters.AddWithValue("@NumSeats", TextBox_NumerSeats.Text); cmd2.Parameters.AddWithValue("@DepartureCity", TextBox_DepartureCity.Text); cmd2.Parameters.AddWithValue("@DestinationCity", TextBox_DestinationCity.Text); cmd2.Parameters.AddWithValue("@DepartureTime", departureTimeStr); cmd2.Parameters.AddWithValue("@ArrivalTime", arrivalTimeStr); // 传递仅日期部分,即使字段是DATETIME,也会自动补0点时间,但参数化方式更可靠 cmd2.Parameters.AddWithValue("@DepartureDate", departureDate.Date); cmd2.Parameters.AddWithValue("@ArrivalDate", arrivalDate.Date); cmd2.ExecuteNonQuery(); Label_EditTableMessage.ForeColor = System.Drawing.Color.Green; Label_EditTableMessage.Text = "Flight Added"; EmptyTextBoxes(); GridView_Flight.DataBind(); }
额外补充两点:
- 如果你没法修改数据库字段类型(比如必须用DATETIME),那么在查询数据时,可以用
CONVERT(VARCHAR, departure_date, 23)或者FORMAT(departure_date, 'yyyy-MM-dd')来提取仅日期的字符串用于显示。 - 参数化查询是编写数据库操作代码的最佳实践,除了安全,还能避免很多因字符串格式不匹配导致的错误。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

