C#DateTime
値と同様に、SQL ServerDateTime
値には形式がありません。これは、2つの32ビット整数で構成される64ビットフィールドです。最初は、エポック(1900年1月1日00:00:00.000)からの日数をカウントします。秒は、1日の開始からの時間を1/300秒でカウントします。
CONVERT()を使用したSQLまたはクライアントコードのいずれかで、表示またはchar/varcharに変換するときにフォーマットを適用します。
あなたのupdate
ステートメントはフォーマットを気にしません:それは価値を気にします。C#DateTime
値をSqlParameter
ストアドプロシージャまたはパラメータ化されたクエリに渡すと、正しいことが起こります。CLRは、一方を他方に魔法のように変換します。
文字列をC#からDateTimeパラメータとして渡す場合は、SQLServerがDateTime文字列として認識する形式である必要があります。その場合、C#文字列からSQLServerの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 ;
}