» »

[C# Linq2SQL]

[C# Linq2SQL]

ql000 ::

spodaj imam metodo, ki zapiše novega partnerja v tabelo Partners na SQL bazo. Metoda pogleda, če partner s tem imenom že obstaja, če ne ga poči v tabelo. Hec pa pa nastane, pri tem, ko hočem zapisati več zapisov, kar pomeni, da je ta metoda v neki for, foreach zanki. V tem primeru mi zapiše vedno samo prvega partnerja, ki ga najde, ostalih pa ne. Preveril sem PartnerID-je in so v redu, Exception pri vpisu v bazo mi tudi ne vrže nobenega errorja.

Metoda:
public Boolean AddPartnerName(String AccountID, String PartnerName, String PartnerAddress, String PartnerCity, String PartnerCountryCode, String PartnerCountryName, out Int32 PartnerID)
        {
            Boolean PartnerExists = false;
            PartnerID = 0;

            Int32 No = B2BDatabase.Partners.Count();   // Preštejemo koliko zapisov je že v tabeli

            // select stavek za browsanje po tabeli Company
            var GetPartnerNames = from Names in B2BDatabase.Partners
                                  select Names;

            var CheckPartnerNames = GetPartnerNames.ToList();   // Dobljena imena iz tabele Partner zapišemo v List

            // Preverjamo samo prvi zapis v tabeli, če obstaja na podlagi iskalnega pogoja. Če obstaja: RecordExists = true!
            for (Int32 i = 0; i < No; i++)
            {
                if (CheckPartnerNames.ElementAt(i).PartnerData_Name.ToString().StartsWith(PartnerName.TrimEnd()) == true)  // Preverjamo če že obstaja partner s to številko bančnega računa
                {
                    Console.WriteLine("Partner že obstaja!");
                    Console.WriteLine("Zapis je na mestu: {0}\n\n", i + 1);
                    PartnerID = i + 1;
                    PartnerExists = true;
                    break;
                }
            }

            // Če zapis tabeli ne obstaja ga dodamo
            if (PartnerExists == false)
            {
                Console.WriteLine("Partner ne obstaja in ga bom dodal!\n\n");
                NewPartner.PartnerID = No + 1;
                PartnerID = No + 1;
                NewPartner.PartnerData_AccountID = AccountID;
                NewPartner.PartnerData_Name = PartnerName;
                NewPartner.PartnerData_Adress = PartnerAddress;
                NewPartner.PartnerData_City = PartnerCity;
                NewPartner.PartnerData_CountryCode = PartnerCountryCode;
                NewPartner.PartnerData_CountryName = PartnerCountryName;

                try
                {
                    B2BDatabase.Partners.InsertOnSubmit(NewPartner);   // Izvede se transaction zapisa
                    B2BDatabase.SubmitChanges();
                    
                }
                catch (System.Exception ex)
                {
                    ex.ToString();
                }
            }

            return PartnerExists;
        }



in potem klic te metode:

            for (Int32 i = 0; i < AccountStatementTransactionNo; i++)
            {
                foreach(www.halcom.si.AccountStatement.xsd.AccStatement.TransactionLocalType.PartnerDataLocalType tr in XMLAccountStatement.Transaction.ElementAt(i).PartnerData)
                {
                    MyPartnerDataVar.ResetPartnerDataVariables();

                    try
                    {
                        MyPartnerDataVar.PartnerDataAccount = tr.Account.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataAccount = "";
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataName = tr.Name.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataName= "Ime" + i.ToString();
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataAddress = tr.Address.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataAddress = "";
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataCity = tr.City.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataCity = "";
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataCountryCode = tr.CountryCode.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataCountryCode = "NoDat";
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataCountryName = tr.CountryName.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataCountryName = "";
                    }

                    Boolean AddedNewPartner = myNewCompanyRecord.AddPartnerName(MyPartnerDataVar.PartnerDataAccount.TrimEnd(),MyPartnerDataVar.PartnerDataName, MyPartnerDataVar.PartnerDataAddress, MyPartnerDataVar.PartnerDataCity, MyPartnerDataVar.PartnerDataCountryCode, MyPartnerDataVar.PartnerDataCountryName, out PartnerID);
                }
            }

BlueRunner ::

V bloku
if (PartnerExists == false)

ti manjka
NewPartner = new KateriKoliTipPačJeTo()

Zgodovina sprememb…

ql000 ::

Đi, Tx za hiter odgovor, BluRunner! Bom probal!

LP,
Igor

ql000 ::

Fak, leti! ;) Samo ni mi jasen mehanizem zakaj? Metoda je itak del razreda, ki ima naslednje definicije za šarenje po tabelah:

static LinqToSQLConnectionDataContext B2BDatabase = new LinqToSQLConnectionDataContext();
static Company NewCompany = new Company(); // Prototip za pisanje v tabelo Company
static Partner NewPartner = new Partner();
static Account NewAccount = new Account();
static Transactions_InterimAndPayStatus_Glava NewAccountStatementPPDGlava = new Transactions_InterimAndPayStatus_Glava();
static Transactions_InterimAndPayStatus_Postavke NewAccountStatementPPDPostavke = new Transactions_InterimAndPayStatus_Postavke();


Metode potem uporabljajo te static definicije. Zakaj zadeva pri enkratnem klicu deluje, pri večkratnem pa ne? Nekaj sem prešprical, zaradi tega bi res prosil, če si nekdo vzame minutko. Tx!

LP

moowy123 ::

Morda zato ker je vse static :D

ql000 ::

Ups! :)) Bk! ;) Tx!

BlueRunner ::

Ni problem (samo) v static, problem je v temu, da ne razumeš načina delovanja LINQ2SQL razredov in logike delovanja tovrstnih okolij v splošnem.

V medpomnilniku si bo LINQ zapomnil (na podlagi šibke reference), da si objekt že enkrat dodal in ga že zato ne moreš še enkrat dodati (INSERT), temveč ga bo pri naslednjem SubmitChanges popravil (UPDATE SET PartnerID = @ParnterID WHERE PartnerID = @Original_ParnterID).

V splošnem pa "static" polja uporabljaš za resnično specifične potrebe, nikakor pa ne na način, kot ga uporabljaš ti. Priporočal ti bi kakšno knjigo v smeri učenja OO programiranja (sumim, da si samouk, ki je začel v VB) in knjigo v kateri boš imel primere dela s C# skupaj z primeri večnitnega programiranja, da dobiš občtek kaj so "static" polja in kje/kdaj/zakaj se jih uporablja.

BlueRunner ::

Aha... samo še eno stvar sem pozabil dodati: Če šele začenjaš, potem se izogibaj static poljem. Če jih ne boš uporabljal, ko bi jih lahko, boš (naivno) naredil delujočo kodo. Če jih uporabljaš nepravilno, pa lahko narediš kodo, ki ti bo "izgledala", kakor da deluje pravilno, lahko pa bo v produkcijskih okoljih odpovedovala na nepredvidljive načine.

ql000 ::

Tx BlueRunner. Če sem čisto iskren mi je static nudil "eleganten" nadomestek uporabe globalnih spremenljivk v C-ju, ko sem še delal z mikrokontrolerji. Bom upošteval tvoj nasvet in se bom poglobil v zadevo. Mi lahko prosim še omeniš, če imaš kake izkušnje, kaj dejansko napačna uporaba static povzroči?

moowy123 ::

Sej že samo dejstvo da ni dinamično, ampak je statično ogromno pomeni... Ustvari se 1x in se uporablja na podlagi razreda -> je statično. Dinamični elementi se ustvarjajo/uničujejo dinamično kar pomeni da jih je lahko več in da so bolj "dinamični" :D.

Malce več si preberi o tem na kakem wiki-ju.

ql000 ::

Nekaj sem že našel. Ravno študiram.

Če prav razumem je uporaba static kritična samo v primeru multithredane aplikacije, ko več niti laufa isto static metodo.

Zgodovina sprememb…

  • spremenil: ql000 ()

BlueRunner ::

Ne nujno samo v multithreaded aplikacijah. Lahko je problematično tudi v aplikacijah, ki so single-threaded, vendar pa sočasno obstaja več kopij istega razreda. Predstavljaj si, da narediš veš instanc razreda (več "kopij" avtomobila), vse kopije pa želijo imeti atribut "barva". Če narediš barvo statično, to pomeni, da imajo lahko vsi avtomobili samo eno barvo. Če pa narediš spremenljivko ne-statično, pa ima lahko vsak avtomobil svojo lastno barvo.

Pravilo, ki sem ga zapisal (za začetnike je static BAD! ™) je smisleno zato, ker lahko v primeru napačne uporabe po nepotrebnem zapravljaš pomnilnik, kar v PC svetu nima katastrofalni posledic. Če pa uporabiš static takrat, ko ga ne bi smel, pa narediš (potencialno) nepravilno delujočo kodo, kar pa ima VEDNO katastrofalne posledice.

Glede na to, da prihajaš iz MC sveta: static polja so tista, kjer si vse kopije strukture med seboj delijo eno pomnilniško lokacijo. Non-static polja so tista, ki se za vsako strukturo "držijo" same strukture. MC svet pa tako ali tako deluje po drugačnih pravilih, kot pa svet namiznih aplikacij.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kam prijaviti poslovanje brez računa?

Oddelek: Loža
103500 (2574) SaXsIm
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61042 (918) detroit
»

pošiljanje SMS C#

Oddelek: Programiranje
132986 (2479) Neon87
»

[C#] try - catch

Oddelek: Programiranje
81234 (991) darkolord
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
71981 (1786) darkolord

Več podobnih tem