SqlDateTime perpilda. Turi būti nuo 1753-01-01 12:00:00 iki 9999-12-31 23:59:59
Atlikdamas atnaujinimo operaciją iš svetainės, nuolat gaudavau klaidą ir maniau, kad tai buvo XML konfigūracija arba kažkas negerai, kai buvo vykdomas SQL sakinys
Bandžiau naudoti SQL užklausų analizatorių, kad paimčiau sugeneruotus SQL sakinius, ir pastebėjau, kad kokia yra teisingo vykdymo problema? SQL sakinys yra toks:
exec sp_executesql N'INSERT INTO dbo. "LeanLogs" (versija, "OrganizationId", "CustomInfoId", "LastLeanAlarmType", "NowLeanAlarmType", "InsertTime", "TreatedTime") REIKŠMĖS (@p0, @p1, @p2, @p3, @p4, @p5, @p6); select SCOPE_IDENTITY()',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 datetime,@p6 datetime',@p0=1,@p1=35,@p2=12,@p3=10,@p4=10,@p5='2017-09-13 13:09:41',@p6=NULL SqlDateTime perpilda. Rezoliucija turi būti --- nuo 1753-01-01 12:00:00 iki 9999-12-31 23:59:59
Klaidos priežastis
Jei duomenų bazei perduoto laiko tipo reikšmė yra NULL arba įterpiant arba atnaujinant duomenų bazę DateTime.MinValue, pagal numatytuosius nustatymus lauko datetime reikšmė yra neapibrėžta. NULL čia reiškia nulį programos kode, ir dauguma scenarijų, kai tai atsitinka, yra šie: programoje apibrėžiamas laiko tipo kintamasis ir jis perduodamas į duomenų bazę (arba saugomą procedūrą) nepriskiriant reikšmės. Šiuo metu šio kintamojo reikšmė pagal numatytuosius nustatymus priskiriama 01/01/01. Kadangi duomenų bazės lauke DateTime tipas minimali reikšmė yra 1/1/1753 12:00:00, o . NET Framework, DateTime tipas, minimali reikšmė yra 1/1/0001 0:00:00, akivaizdu, kad ji nepatenka į minimalų sql reikšmės diapazoną, todėl atsiranda duomenų perpildymo klaida. Pažvelkime, kaip pamatyti .net ir sql maksimalų minimalų laiką per C#:
Išvesties efektas:
Galų gale, jis buvo tinkered daugiau nei dešimt minučių,
Galutinės klaidos priežastys yra šios:
Vienas iš objekto atributų tipų taip pat yra objektas, tai yra, lentelė turi išorinį raktą, o į išorinio rakto lentelę pridedamas naujas datetime atributas, kuriam nepriskirta reikšmė ir nenustatytas nulinis tipas
Įtraukiant arba atnaujinant objektą, išorinio rakto objekto datetime automatiškai pridedamas prie numatytosios reikšmės, nes .net numatytosios reikšmės laikas yra mažesnis už numatytąjį minimalų duomenų bazės laiką
Sprendimas: Nustatykite išorinio rakto objekto datetime tipo ypatybę į nulinį tipą, padėkite kolegoms ją puikiai išspręsti!
|