You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DateTime转字符串格式转换错误:预订表数据插入代码求助

解决DateTime转字符串格式错误的SQL插入问题

这个问题很常见,根源在于你直接把DateTime值拼接到SQL语句里——手动处理日期格式不仅容易和数据库的格式要求不匹配(比如SQL Server默认更兼容ISO格式yyyy-MM-dd,而你的数据是dd/MM/yyyy),还会带来SQL注入的安全风险。咱们用参数化查询就能彻底解决这个问题:

修正后的代码示例

public void insertBooking(int bookingID, int customerID, int entertainmentID, DateTime bookingDate, int numberOfGuests, double price, bool deposit, decimal depositPrice) 
{ 
    db.Cmd = db.Conn.CreateCommand(); 
    // 使用参数化SQL,避免手动拼接字符串
    db.Cmd.CommandText = @"INSERT INTO Booking 
                          (bookingID, customerID, entertainmentID, [Booking Date], [Number of Guests], Price, Deposit, [Deposit Price])
                          VALUES 
                          (@BookingID, @CustomerID, @EntertainmentID, @BookingDate, @NumberOfGuests, @Price, @Deposit, @DepositPrice)";

    // 逐个添加参数,直接传递原始类型,无需手动转换字符串
    db.Cmd.Parameters.AddWithValue("@BookingID", bookingID);
    db.Cmd.Parameters.AddWithValue("@CustomerID", customerID);
    db.Cmd.Parameters.AddWithValue("@EntertainmentID", entertainmentID);
    // DateTime类型直接传入,数据库驱动会自动处理格式转换
    db.Cmd.Parameters.AddWithValue("@BookingDate", bookingDate);
    db.Cmd.Parameters.AddWithValue("@NumberOfGuests", numberOfGuests);
    db.Cmd.Parameters.AddWithValue("@Price", price);
    db.Cmd.Parameters.AddWithValue("@Deposit", deposit);
    db.Cmd.Parameters.AddWithValue("@DepositPrice", depositPrice);

    // 执行插入操作
    db.Cmd.ExecuteNonQuery();
}

为什么这样能解决问题?

  • 类型安全:参数化查询让数据库驱动负责数据类型的转换,确保DateTime值以数据库能识别的格式传递,完全避免了手动转字符串的格式错误。
  • 安全可靠:彻底杜绝了SQL注入攻击,这是直接拼接SQL语句的重大安全隐患。
  • 易维护:代码更清晰,不需要在SQL字符串里处理各种类型的格式转换逻辑。

如果你坚持要手动处理日期格式(不推荐),可以强制将DateTime转为数据库兼容的字符串格式,比如ISO 8601格式:

string formattedDate = bookingDate.ToString("yyyy-MM-dd HH:mm:ss");

但这种方式依然存在SQL注入风险,所以参数化查询才是最优解。

内容的提问来源于stack exchange,提问作者Conor Casey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:46:31