C# 将日期时间转换为字符串格式时出错
我对这段代码有问题,我正试图在我的预订表中插入一条记录。我试图输入的值是(6,3,3,20/06/2018 00:00:004002800.00,True,560.00) 我得到的错误如下: “从字符转换日期和/或时间时,转换失败 绳子。”C# 将日期时间转换为字符串格式时出错,c#,sql,datetime,sql-insert,C#,Sql,Datetime,Sql Insert,我对这段代码有问题,我正试图在我的预订表中插入一条记录。我试图输入的值是(6,3,3,20/06/2018 00:00:004002800.00,True,560.00) 我得到的错误如下: “从字符转换日期和/或时间时,转换失败 绳子。” 我已经尽力研究这个问题,但我不知道如何解决这个问题。非常感谢您的帮助。好的,您的代码有一些问题。我将尝试按顺序解释所有这些问题 首先,如果将DateTime值与字符串串联(在+运算符上),则会自动为它们调用.ToString方法,并为数据库列生成可能正确的或
我已经尽力研究这个问题,但我不知道如何解决这个问题。非常感谢您的帮助。好的,您的代码有一些问题。我将尝试按顺序解释所有这些问题 首先,如果将
DateTime
值与字符串串联(在+
运算符上),则会自动为它们调用.ToString
方法,并为数据库列生成可能正确的或可能不正确的文本。您需要直接传递DateTime
值。如果你不知道,你知道你的价值观,你也可以阅读
正如评论中所建议的,解决此类情况的最佳方法是使用。另一方面,这些字符串连接对攻击是开放的
还可用于自动处理您的连接(我们没有看到,但是..)和命令,而不是手动调用(您没有看到)
例如,
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();
}
}
好的,你的代码有一些问题。我将尝试按顺序解释所有这些问题 首先,如果将
DateTime
值与字符串串联(在+
运算符上),则会自动为它们调用.ToString
方法,并为数据库列生成可能正确的或可能不正确的文本。您需要直接传递DateTime
值。如果你不知道,你知道你的价值观,你也可以阅读
正如评论中所建议的,解决此类情况的最佳方法是使用。另一方面,这些字符串连接对攻击是开放的
还可用于自动处理您的连接(我们没有看到,但是..)和命令,而不是手动调用(您没有看到)
例如,
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();
}
}
要修复此错误,请使用
bookingDate.ToString(“O”)
也就是说,像这样构建SQL查询被认为不是一个好的实践。如评论中所述,建议您避免此类问题。若要修复错误,请使用
bookingDate.ToString(“O”)
也就是说,像这样构建SQL查询被认为不是一个好的实践。如评论中所述,建议您避免此类问题。SQL Server附带以下数据类型,用于在数据库中存储日期或日期/时间值:
- 日期-格式为YYYY-MM-DD
- 日期时间-格式:YYYY-MM-DD HH:MI:SS
- SMALLDATETIME-格式:YYYY-MM-DD HH:MI:SS
- 时间戳格式:一个唯一的数字
DateTime your_datetime_instance = DateTime.Now; var str = your_datetime_instance.ToString("yyyy-MM-dd");
- 日期-格式为YYYY-MM-DD
- 日期时间-格式:YYYY-MM-DD HH:MI:SS
- SMALLDATETIME-格式:YYYY-MM-DD HH:MI:SS
- 时间戳格式:一个唯一的数字
DateTime your_datetime_instance = DateTime.Now; var str = your_datetime_instance.ToString("yyyy-MM-dd");
yyyy-MM-dd
或yyyyyymmdd
,对于datetime-yyy-MM-ddTHH:MM:ss
。请注意,如果您正在转换为DateTime,则从DateTime格式中省略T
将使DateTime值的字符串表示特定于区域性,但如果您正在转换为DateTime2,则不会。这是错误的。SQL Server不存储任何日期或日期时间数据类型的显示格式。它可以隐式地将特定格式的字符串转换为datetime和datetime2,这些格式是特定于区域性的或ISO 8601,因此对于日期,可以使用yyyy-MM-dd
或yyyyyymmdd
,对于datetime-yyy-MM-ddTHH:MM:ss
。请注意,如果您正在转换为DateTime,则从DateTime格式中省略T
,将使DateTime值的字符串表示特定于区域性,但如果您正在转换为DateTime2,则不会。