// valid for DateTime, SmallDateTime, Date, DateTime2 internal void SetDateTime(DateTime value) { Debug.Assert( SmiXetterAccessMap.IsSetterAccessValid(_metaData, SmiXetterTypeCode.XetDateTime)); if (SqlDbType.Variant == _metaData.SqlDbType) { if ((_variantType != null) && (_variantType.SqlDbType == SqlDbType.DateTime2)) { _stateObj.Parser.WriteSqlVariantDateTime2(value, _stateObj); } else if ((_variantType != null) && (_variantType.SqlDbType == SqlDbType.Date)) { _stateObj.Parser.WriteSqlVariantDate(value, _stateObj); } else { TdsDateTime dt = MetaType.FromDateTime(value, 8); _stateObj.Parser.WriteSqlVariantHeader(10, TdsEnums.SQLDATETIME, 0, _stateObj); _stateObj.Parser.WriteInt(dt.days, _stateObj); _stateObj.Parser.WriteInt(dt.time, _stateObj); } // Clean the variant metadata to prevent sharing it with next row. // As a reminder, SetVariantType raises an assert if _variantType is not clean _variantType = null; } else { _stateObj.WriteByte((byte)_metaData.MaxLength); if (SqlDbType.SmallDateTime == _metaData.SqlDbType) { TdsDateTime dt = MetaType.FromDateTime(value, (byte)_metaData.MaxLength); Debug.Assert(0 <= dt.days && dt.days <= UInt16.MaxValue, "Invalid DateTime '" + value + "' for SmallDateTime"); _stateObj.Parser.WriteShort(dt.days, _stateObj); _stateObj.Parser.WriteShort(dt.time, _stateObj); } else if (SqlDbType.DateTime == _metaData.SqlDbType) { TdsDateTime dt = MetaType.FromDateTime(value, (byte)_metaData.MaxLength); _stateObj.Parser.WriteInt(dt.days, _stateObj); _stateObj.Parser.WriteInt(dt.time, _stateObj); } else { // date and datetime2 int days = value.Subtract(DateTime.MinValue).Days; if (SqlDbType.DateTime2 == _metaData.SqlDbType) { Int64 time = value.TimeOfDay.Ticks / TdsEnums.TICKS_FROM_SCALE[_metaData.Scale]; _stateObj.WriteByteArray(BitConverter.GetBytes(time), (int)_metaData.MaxLength - 3, 0); } _stateObj.WriteByteArray(BitConverter.GetBytes(days), 3, 0); } } }
public static TdsDateTime FromDateTime(DateTime dateTime, byte cb) { SqlDateTime sqlDateTime; TdsDateTime tdsDateTime = new TdsDateTime(); Debug.Assert(cb == 8 || cb == 4, "Invalid date time size!"); if (cb == 8) { sqlDateTime = new SqlDateTime(dateTime); tdsDateTime.time = sqlDateTime.TimeTicks; } else { // note that smalldatetime is days&minutes. // Adding 30 seconds ensures proper roundup if the seconds are >= 30 // The AddSeconds function handles eventual carryover sqlDateTime = new SqlDateTime(dateTime.AddSeconds(30)); tdsDateTime.time = sqlDateTime.TimeTicks / SqlDateTime.SQLTicksPerMinute; } tdsDateTime.days = sqlDateTime.DayTicks; return(tdsDateTime); }