从日期时间到字符串格式的转换错误

时间:2018-04-22 13:50:55

标签: c# sql datetime sql-insert

我对这部分代码有疑问,我试图在我的预订表中插入记录。我尝试输入的值是(6,3,3,20/06/2018 00:00:00,400,2800.00,True,560.00)

        public void insertBooking(int bookingID, int customerID, int entertainmentID, 
                                  DateTime bookingDate, int numberOfGuests, double price, 
                                  bool deposit, decimal depositPrice)
        {
            db.Cmd = db.Conn.CreateCommand();
            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.ExecuteNonQuery();
        }

我得到的错误如下,

  

"从字符转换日期和/或时间时转换失败   。字符串"

我尽力研究这个问题,但我无法弄清楚如何解决这个问题。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

哦,你的代码有一些问题。我将尝试按顺序解释所有这些。

首先,如果您将DateTime值与字符串连接一起使用(在+运算符上),.ToString方法会自动调用它们,您可能会得到或不会得到"适当"为您的数据库列生成的文本。 Do not choose wrong data types for your columns。您需要直接传递DateTime 。如果您不知道,SqlDbType您知道哪些价值观,那么您也可以阅读Mapping CLR Parameter Data

正如评论中所建议的,解决此类情况的最佳方法是使用parameterized queries。另一方面,这些字符串连接对SQL Injection攻击开放。

还可以使用using statement来自动处理您的连接(我们不会看到但是......)和命令,而不是手动调用.Dispose method(您没有这样做)。 / p>

作为一个例子;

public void insertBooking(int bookingID, int customerID, int entertainmentID,
                          DateTime bookingDate, int numberOfGuests, double price,
                          bool deposit, decimal depositPrice)
{
    using (var con = new SqlConnection(yourConnectionString))
    using (var cmd = con.CreateCommand())
    {
        cmd.CommandText = @"INSERT INTO Booking (bookingID, customerID, entertainmentID, 
                            [Booking Date], [Number Of Guests], [Price], [Deposit?], 
                            [Deposit Price]) Values(@bookId, @cusId, @entId, @bookdate, @guests, @price, @deposit, @depositPrice)";
        cmd.Parameters.Add("@bookId", SqlDbType.Int).Value = bookingID;
        cmd.Parameters.Add("@cusId", SqlDbType.Int).Value = customerID;
        cmd.Parameters.Add("@entId", SqlDbType.Int).Value = entertainmentID;
        cmd.Parameters.Add("@bookdate", SqlDbType.DateTime).Value = bookingDate;
        cmd.Parameters.Add("@guests", SqlDbType.Int).Value = numberOfGuests;
        cmd.Parameters.Add("@price", SqlDbType.Decimal).Value = price;
        cmd.Parameters.Add("@deposit", SqlDbType.Bit).Value = deposit;
        cmd.Parameters.Add("@depositPrice", SqlDbType.Decimal).Value = depositPrice;

        con.Open();
        cmd.ExecuteNonQuery();
    }
}

答案 1 :(得分:1)

要修正错误,请使用bookingDate.ToString("O")

话虽如此,构建这样的SQL查询并不是一个好习惯。正如评论中所提到的,建议您use the Parameters property of your SQLCommand instance避免此类问题。

答案 2 :(得分:0)

SQL Server附带以下数据类型,用于在数据库中存储日期或日期/时间值:

  • 日期 - 格式YYYY-MM-DD。

  • DATETIME - 格式:YYYY-MM-DD HH:MI:SS。

  • SMALLDATETIME - 格式:YYYY-MM-DD HH:MI:SS。

  • TIMESTAMP - 格式:唯一编号。

    DateTime your_datetime_instance = DateTime.Now;
    var str = your_datetime_instance.ToString("yyyy-MM-dd");