Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将日期时间转换为字符串格式时出错_C#_Sql_Datetime_Sql Insert - Fatal编程技术网

C# 将日期时间转换为字符串格式时出错

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方法,并为数据库列生成可能正确的或

我对这段代码有问题,我正试图在我的预订表中插入一条记录。我试图输入的值是(6,3,3,20/06/2018 00:00:004002800.00,True,560.00)

我得到的错误如下:

“从字符转换日期和/或时间时,转换失败 绳子。”


我已经尽力研究这个问题,但我不知道如何解决这个问题。非常感谢您的帮助。

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

首先,如果将
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");
    

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");
    

学习使用参数进行查询。不要用字符串常量来处理查询。解决问题和SQL注入的方法总是一样的。使用参数应该说它们是参数,我说我输入的值只是examples@ConorCasey这些不是sql参数。我们要告诉你的是使用命令对象@Steve的参数集合哦,对了,我不好,我现在明白你的意思了,谢谢你的建议,但Kzrystof的答案对我还是有用的。谢谢大家。学习使用参数进行查询。不要用字符串常量来处理查询。解决问题和SQL注入的方法总是一样的。使用参数应该说它们是参数,我说我输入的值只是examples@ConorCasey这些不是sql参数。我们要告诉你的是使用命令对象@Steve的参数集合哦,对了,我不好,我现在明白你的意思了,谢谢你的建议,但Kzrystof的答案对我还是有用的。谢谢大家。谢谢这已经解决了我的所有问题,对SQL来说是比较新的,所以不是100%符合所有典型的约定,但是从现在起我肯定会使用Parameters函数。谢谢!感谢这已经解决了我所有的问题,对SQL来说是比较新的,所以不是100%符合所有典型的约定,但是从现在起我肯定会使用Parameters函数。谢谢!那是错的。SQL Server不存储任何日期或日期时间数据类型的显示格式。它可以隐式地将特定格式的字符串转换为datetime和datetime2,这些格式是特定于区域性的或ISO 8601,因此对于日期,可以使用
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,则不会。