与 C#DateTime
值一样,SQL ServerDateTime
值没有格式:它只是一个由两个 32 位整数组成的 64 位字段。第一个计算纪元以来的天数(1900 年 1 月 1 日 00:00:00.000);秒以 1/300 秒为单位计算自一天开始以来的时间。
在使用CONVERT()在 SQL 中或在客户端代码中显示或将其转换为 char/varchar 时应用格式。
您的update
陈述不关心格式:它关心价值。如果您将 C#DateTime
值作为 aSqlParameter
传递给您的存储过程或参数化查询,那么正确的事情将会发生:CLR 会神奇地为您将一个转换为另一个。
如果从 C# 将字符串作为 DateTime 参数传递,则它需要采用 SQL Server 将识别为 DateTime 字符串的格式。假设是这种情况,从 C# 字符串到 SQL Server DateTime 值的转换同样会神奇地发生。
鉴于您的update
陈述,您应该使用以下代码:
public int UpdateDiscount( int discountPromotionalID , bool isActive , string title , DateTime beginDate , DateTime endDate , int discountPercentage )
{
const string updateQuery = @"
Update discount
set DiscountPromotionalID = @DiscountPromotionalID ,
isActive = @isActive ,
Title = @Title ,
BeginDate = @BeginDate ,
EndDate = @EndDate ,
DiscountPercentage = @DiscountPercentage
where DiscountPromotionalID = @DiscountPromotionalID
" ;
int rowsAffected ;
using ( SqlConnection connection = new SqlConnection( SomeConnectString ) )
using ( SqlCommand cmd = connection.CreateCommand() )
{
cmd.CommandText = updateQuery ;
cmd.CommandType = CommandType.Text ;
cmd.Parameters.AddWithValue( "@DiscountPromotionalID" , discountPromotionalID ) ;
cmd.Parameters.AddWithValue( "@isActive" , isActive ? 1 : 0 ) ; // C# bools are true/false; SQL bools are 1/0
cmd.Parameters.AddWithValue( "@Title" , title ) ;
cmd.Parameters.AddWithValue( "@BeginDate" , beginDate ) ;
cmd.Parameters.AddWithValue( "@EndDate" , endDate ) ;
cmd.Parameters.AddWithValue( "@DiscountPercentage" , discountPercentage ) ;
connection.Open() ;
rowsAffected = cmd.ExecuteNonQuery() ;
connection.Close() ;
}
return rowsAffected ;
}