Miért nem menti el az Adatbázisba?

Miért nem menti el az Adatbázisba?
2012-09-04T21:01:46+02:00
2012-09-09T16:59:29+02:00
2022-11-26T19:55:41+01:00
dreddon
Hello!

Az alábbi kódot írva abba a problémába ütköztem, hogy az adatbázisban nem frissülnek az adatok.


var result = from w in dS_WeatherS1.Weather from ws in dS_WeatherS1.WeatherStatistics where w.WCity_id == ws.WSCity_id & w.Temperature < ws.AvargeTemperature select new { w.WeatherID, w.Temperature, w.Pressure, w.SensendDate, w.WCity_id }; DS_WeatherSTableAdapters.HigherWeatherTableAdapter HigherWeatherTableAdapter = new DS_WeatherSTableAdapters.HigherWeatherTableAdapter(); HigherWeatherTableAdapter.Fill(dS_WeatherS1.HigherWeather); foreach (var item in result) { HigherWeatherTableAdapter.Insert(item.WeatherID, item.Temperature, item.Pressure, item.SensendDate, item.WCity_id); } dS_WeatherS1.HigherWeather.AcceptChanges();

Mssql Exprest-t használok, a LINQ-s kód megfelelő mert azokat és úgy szedi ki ahogy én szeretném. Kivétel nem váltódik ki rendesen lefut a kód, csak nincs benne az adatbázisban. Amennyiben az adatbázis frissítése nélkül újra lefuttatom a progit, akkor viszont elsődleges kulcs hibát kapok, tehát úgy kezeli mintha benne lenne az adatbázisban.

Használható Ötletek? Több kód is van, de a lényeg ez, ha kérdés van válaszolok szívesen, mert már sokadjára ütközök ebbe a hibába... :(
Mutasd a teljes hozzászólást!
Ok, nézd meg
Weather___Beks.sdf
hány példányban leledzik a gépeden.
Mutasd a teljes hozzászólást!

  • Amennyiben ez Linq to SQL akar lenni és a dS_WeatherS1 a data context-ed, akkor inkább a SubmitChanges() metódust kéne hívnod a mentéshez.

    Ennek a topicnak az alján írtam egy példát (2012.08.09. 14:48), hogyan kell rekordot beszúrni ill. módosítani.
    Mutasd a teljes hozzászólást!
  • Nem, Data Set-ekkel manipulálok, egyelőre még a LINQ to SQL-t ki szeretném hagyni a dologból. Tehát a ds_weathers1 az egy DataSet.
    Mutasd a teljes hozzászólást!
  • Nézd meg ezt a linket.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Nagyon jónak tűnik és egyszerűnek, de akkor sem sikerül így. Lehet hogy az insert() lesz a hibás? Mert meghívtam a tábla és a DS szintű acceptchanges-t is, de semmi.
    Mutasd a teljes hozzászólást!
  • Elolvastad a link-em?
    Csak a ds-re hat az AcceptChanges, ha az adatbázisba is mentenéd a változásokat, ahhoz UPDATE kell.

    How to: Update Records in a Database
    You can use the TableAdapter.Update method to update (edit) records in a database. The TableAdapter.Update method provides several overloads that perform different operations depending on the parameters passed in. It is important to understand the results of calling these different method signatures.
    Mutasd a teljes hozzászólást!
  • Semmi hibaüzenet? Debuggolni kellene?
    Mutasd a teljes hozzászólást!
  • Hívtam a Datasetre egy update-t:
    HigherWeatherTableAdapter.Update(dS_WeatherS1);

    Azóta az adatbázissal nem tudok kapcsolatot teremteni, kapok ilyen hibaüzenetet:

    The path is not of a legal form.

    Mutasd a teljes hozzászólást!
  • Debuggolás megtörtént korábban, akkor sem volt semmilyen hiba. minden rendszerint lefutott, kivéve hogy mégsem maradt az adat a DB-ben.

    Előzőhöz:
    Conncetion hiba megoldva, újratöltöttem a projektet.
    De az eredeti hiba még mindig nem megoldott. Próbálom Riha megoldását
    Mutasd a teljes hozzászólást!
  • Továbbra sem. Megpróbálom részletesebben kifejteni a dolgokat hátha lesz valahol hiba.

    Létrehoztam egy adatbázist (Microsoft SQL Server Compact 3.5 ) a Visual studioból. Szintén kattintgatással feltöltögettem táblákkal és adatokkal. Egy gomb megnyomására az egyik eddig üres táblába(HigherWeathers) be szeretnék néhány sort szúrni egy másik táblából, aminek ugyanaz a sémája.

    Megkeresem a beszúrandó sorokat LINQ-val.
    Már van egy dS_Weathers néven.
    Létrehozom a HigherWeathers-höz tartozó tableadatptert, majd fel is Fillezem (bár ez felesleges mivel üresből indul, de midnegy)

    DS_WeatherSTableAdapters.HigherWeatherTableAdapter HigherWeatherTableAdapter = new DS_WeatherSTableAdapters.HigherWeatherTableAdapter(); HigherWeatherTableAdapter.Fill(dS_WeatherS1.HigherWeather);

    Végigmegyek a LINQ által visszaadott objektumon, és egyesével beszúrom a HigherWeatherTableAdapter segítségével a sorokat:


    foreach (var item in result) { HigherWeatherTableAdapter.Insert(item.WeatherID, item.Temperature, item.Pressure, item.SensendDate, item.WCity_id); }

    Aztán a biztonság kedvéért az update előtt és után is kap egy AcceptChanges-t a dataset:


    dS_WeatherS1.HigherWeather.AcceptChanges(); HigherWeatherTableAdapter.Update(dS_WeatherS1.HigherWeather); dS_WeatherS1.HigherWeather.AcceptChanges();

    Ennyi.
    Na már most, ha másodjára is meghívom akkor kidobja a hibát hogy már van ilyen sor. (Valszeg a datsetre vonatkozik). Azonban ha nem hívom meg megint csak ránézek a Server Explorerben a DB-re és lecsekkolom az adatokat, ott persze nincs semmi. Ha ezután újra meghívom a progit, akkor persze nem lesz hiba a redundancia miatt, csak a következő hívásig.

    Na ennél jobban nem tudom leírni a problémát :))
    De ha azon múlik csinálok képeket vagy videót :D :P
    Mutasd a teljes hozzászólást!
  • Hasonló téma..(Visual Studio 2010 C# tableadapter update command not saving data to SQL Server Compact Edition 3.5 sdf file )

    S igy már egész más a leányzó fekvése..
    Bocsi, de ezzel kellett volna kezdened (Létrehoztam egy adatbázist Microsoft SQL Server Compact 3.5).

    . Do not call acceptchanges - also check your connection string, if it uses "DataDirectory", check your bin/debug folder for a copy of the database file. . .

    Egyébként sok bosszúságtól menthetnéd meg magad, ha egy komolyabb adatbáziskezelővel ismerkednél.
    Mutasd a teljes hozzászólást!
  • :) Próbáltam ezzel kezdeni, csak valahogy sose tünik fontosnak az a compact szó :D

    Már több adatbáziskezelőrendszerrel is ismerkedem, és használom, de ez az ami mindig kéznél van még akkor is ha idegen gépre megyek és csak egy VS van fel téve, tehát ezzel is meg kéne tudom oldani az alapműveleteket. Én is tudom hogy sok a gond vele, szidtuk is rendesen az elmúlt két napban, de most ez volt az "eszköz a kézben". :D

    Connection string: \Weather___Beks.sdf;Persist Security Info=True
    Mutasd a teljes hozzászólást!
  • de ez az ami mindig kéznél van még akkor is ha idegen gépre megyek és csak egy VS van fel téve, tehát ezzel is meg kéne tudom oldani az alapműveleteket.

    Csak tudod, az sdf és az mdf között akkora a különbség, mint egy kulcsos ház és egy öt csillagos szálloda között.
    Az előbbiben minden rád van bízva kaptál egy üres lakást, míg a másik elhalmoz a szolgáltatásaival.
    Azért szvsz ritka az olyan gép ahol van VS és nincs Management Studio.
    A VS-ből kreálhatsz pl. SQL 2008 R2-re is adatbázist, s ha használod a varázslót, a dataset-en át a tableadapter-ig kattintgatással összejön minden.
    Sőt, ha a tableadapter-t ráhúzod a form-odra, már egy datagridview-ban böngészheted a táblád vagy lekérdezésed adatait. Kapsz többek között bindingsource-t és bindingnavigator-t.
    A bindingnavigator helyből biztosítja az adatsorok elérését, módosítását, törlését és új sorok beszúrását.
    Mindezt egyetlen sor kódolás nélkül.

    Érdemes böngészni ha ragszkodsz a Compact-hoz..(Walkthrough: Creating a SQL Server Compact Database)
    Mutasd a teljes hozzászólást!
  • Már több adatbáziskezelőrendszerrel is ismerkedem, és használom, de ez az ami mindig kéznél van még akkor is ha idegen gépre megyek és csak egy VS van fel téve, tehát ezzel is meg kéne tudom oldani az alapműveleteket


    Alapvetően az adatelérés adatbázistól független. Teljesen mindegy (többé-kevésbé, hiszen a feature-ök eltérhetnek), hogy MSSQL, SQL CE-t vagy akár MySQL-t használsz, ami számít, az adatelérés módja. A provider-ek biztosítják az adatbázis-specifikus kódot.

    Az általad használt Dataset/DataAdapteres megközelítés idejétmúlt, gyakorlatilag csak meglévő projectek karbantartásánál van szerepe.

    Ma az MS által ajánlott megközelítés az Entity Framework használata, illetve ha teljes kontrollt akarsz és ADO.NET-ezel, akkor is inkább általad kreált entity class-okba kéne az adatokat rakni Datasetek helyett.
    Mutasd a teljes hozzászólást!
  • Olvasom és úgy használom ahogy logikus és ahogy le van írva, de attól még nem tudok továbbjutni az előbbi kommentemnél.

    Igen tisztában vagyok hogy lépni kéne újabb technológiára, de attól még ennek is működnie kéne, legalább egy projekt erejéig :(
    Mutasd a teljes hozzászólást!
  • Ok, nézd meg
    Weather___Beks.sdf
    hány példányban leledzik a gépeden.
    Mutasd a teljes hozzászólást!
  • 2 db, egy a solution mappájában, egy pedig a bin/debug-ban.
    Továbbá ha belenézek a /bin/debug félébe, ott megvannak az adatok. De az eredetiben még mindig nincs.
    Mutasd a teljes hozzászólást!
  • De az eredetiben még mindig nincs.

    Akkor már sejted ugye, hogy hol a gubanc?
    Mutasd a teljes hozzászólást!
  • Igen... Csak kicsit felbosszant, hogy ha létrehoz a progi egy adatbázist amit használ, akkor miért nem azt használja onnantól végig :D

    Tehát átírtam a connection Stringet ...\bin\debug\weather_beks.sdf) , majd kitöröltem a solution szintű sdf-et. Onnantól kezdve úgy működött ahogy szerettem volna.
    Felajánlott anno egy olyat a VS, hogy "nincs a mappában az adatbázis egy példánya, kíván e oda létrehozni egy másolatot...". Tehát körölbelül ott rontottam el. Vagy nemet kellett volna mondanom, vagy már ott átírni a C. stringet :)
    Nem baj megtanultam. Ezzel egyúttal egy korábbi prog.hu-s kérdésem is megoldódott amit veled, Riha, próbáltunk megoldani.


    Köszönöm a segítséget!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd