NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Maros2470
Člen
Avatar
Maros2470:20.9.2017 7:54

Zdravím.

Potřeboval bych poradit. Pracuji se souborem CSV (obsahuje názvy firem a další data), který načtu a uložím jako Import do databáze. Dále bych, ale potřeboval uložit jako Customer do databáze název firmy, ale pouze jednou, takže bych potřeboval filtrovat. Pracuji s SQLCE a EF. Import a Customer jsou ObservableCollec­tion.

Tady je co mám zatím napsáno:

public void LoadData()
        {
            if (Imports.Count() == 0)
            {
                cesta1 = System.IO.Path.Combine(cesta, @"Import.csv");

                try
                {

                    using (StreamReader sr = new StreamReader(cesta1, Encoding.Default))
                    {
                        string s;
                        while ((s = sr.ReadLine()) != null)
                        {
                            string[] distribution = s.Split(';');
                            Import imp = new Import()
                            {
                                Customer = distribution[0],
                                Place_1 = distribution[1],
                                Place_2 = distribution[2],
                                Place_3 = distribution[3],
                                Place_4 = distribution[4],
                                Id = distribution[5],
                                Name = distribution[6],
                                SortingKey = distribution[7],
                                InvertoryNumber = distribution[8],
                                SerialNumber = distribution[9],
                                CordLength = distribution[10],
                                RevisionInterval = distribution[11],
                                TakenIntoEvidence = distribution[12],
                                Note = distribution[13],
                                Group = distribution[14],
                                ProtectionClass = distribution[15],
                                Category = distribution[16],
                                EquipmentClass = distribution[17],
                                ConnectionMethod = distribution[18],
                                UserValue_0_Name = distribution[19],
                                UserValue_0_Value = distribution[20],
                                UserValue_1_Name = distribution[21],
                                UserValue_1_Value = distribution[22],
                                UserValue_2_Name = distribution[23],
                                UserValue_2_Value = distribution[24],
                                UserValue_3_Name = distribution[25],
                                UserValue_3_Value = distribution[26],
                                UserValue_4_Name = distribution[27],
                                UserValue_4_Value = distribution[28],
                                UserValue_5_Name = distribution[29],
                                UserValue_5_Value = distribution[30],
                                UserValue_6_Name = distribution[31],
                                UserValue_6_Value = distribution[32],
                                UserValue_7_Name = distribution[33],
                                UserValue_7_Value = distribution[34],
                                UserValue_8_Name = distribution[35],
                                UserValue_8_Value = distribution[36],
                                UserValue_9_Name = distribution[37],
                                UserValue_9_Value = distribution[38],
                                MeasDate = distribution[39],
                                mPR = distribution[40],
                                mZK = distribution[41],
                                mRpe200mA = distribution[42],
                                mRpe10A = distribution[43],
                                mU10A = distribution[44],
                                mRiso500V = distribution[45],
                                mRiso250V = distribution[46],
                                mRiso100V = distribution[47],
                                mRisoIn_W = distribution[48],
                                mRisoW_PE = distribution[49],
                                mRisoIn_PE = distribution[50],
                                mIpe = distribution[51],
                                mIpeInv = distribution[52],
                                mIpeExt = distribution[53],
                                mIdif = distribution[54],
                                mIdifInv = distribution[55],
                                mIdifExt = distribution[56],
                                mId = distribution[57],
                                mIdDif = distribution[58],
                                mIsub = distribution[59],
                                mId_W = distribution[60],
                                mIdDif_W = distribution[61],
                                mP = distribution[62],
                                mPExt = distribution[63],
                                mS = distribution[64],
                                mSExt = distribution[65],
                                mcosPhi = distribution[66],
                                mI = distribution[67],
                                mU = distribution[68],
                                mIExt = distribution[69],
                                mTemp = distribution[70],
                                mRPM = distribution[71],
                                mUo_Vef = distribution[72],
                                mUo_Vpp = distribution[73],
                                mIm_S_n = distribution[74],
                                mIm_P_n = distribution[75],
                                mIm_P_p = distribution[76],
                                mIm_P_pz = distribution[77],
                                MeasInspectionNote = distribution[78],
                                MeasInspectionStatus = distribution[79],
                                MeasFunctTestNote = distribution[80],
                                MeasFunctTestStatus = distribution[81],
                                MeasMeasurementsNote = distribution[82],
                                MeasMeasurementsStatus = distribution[83],
                                MeasGlobalNote = distribution[84],
                                MeasGlobalStatus = distribution[85],
                                InspectorName = distribution[86],
                                InspectorSecondName = distribution[87],
                                InspectorLicense = distribution[88],
                                DeviceSerialNum = distribution[89],
                                DeviceType = distribution[90],
                                DeviceCalibrationNum = distribution[91],
                                DeviceCalibrationExpire = distribution[92],
                                SupplFirm = distribution[93],
                                SupplIC = distribution[94],
                            };

                            Imports.Add(imp);

                            Customer cust = new Customer();
                            cust.NazevFirmy = distribution[0];
                            Customers.Add(cust);
                            Save();
                            ImportCount = Imports.Count();
                        }
                    }
                }
                catch (Exception ex)
                {
                    WPFMessageBox.Show(ex.Message, "CHYBA!!!", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            else
                WPFMessageBox.Show("Vyprázdněte data!", "CHYBA!!!", MessageBoxButton.OK, MessageBoxImage.Error);
        }

Díky za rady

 
Odpovědět
20.9.2017 7:54
Avatar
plelovsky
Člen
Avatar
plelovsky:20.9.2017 9:25
public void LoadData()
        {
            if (Imports.Count() == 0)
            {
                cesta1 = System.IO.Path.Combine(cesta, @"Import.csv");

                try
                {

                    using (StreamReader sr = new StreamReader(cesta1, Encoding.Default))
                    {
                        HashSet<string> names = new HashSet<string>();
                        string s;
                        while ((s = sr.ReadLine()) != null)
                        {
                            string[] distribution = s.Split(';');
                            Import imp = new Import()
                            {
                                Customer = distribution[0],
                                Place_1 = distribution[1],
                                Place_2 = distribution[2],
                                Place_3 = distribution[3],
                                Place_4 = distribution[4],
                                Id = distribution[5],
                                Name = distribution[6],
                                SortingKey = distribution[7],
                                InvertoryNumber = distribution[8],
                                SerialNumber = distribution[9],
                                CordLength = distribution[10],
                                RevisionInterval = distribution[11],
                                TakenIntoEvidence = distribution[12],
                                Note = distribution[13],
                                Group = distribution[14],
                                ProtectionClass = distribution[15],
                                Category = distribution[16],
                                EquipmentClass = distribution[17],
                                ConnectionMethod = distribution[18],
                                UserValue_0_Name = distribution[19],
                                UserValue_0_Value = distribution[20],
                                UserValue_1_Name = distribution[21],
                                UserValue_1_Value = distribution[22],
                                UserValue_2_Name = distribution[23],
                                UserValue_2_Value = distribution[24],
                                UserValue_3_Name = distribution[25],
                                UserValue_3_Value = distribution[26],
                                UserValue_4_Name = distribution[27],
                                UserValue_4_Value = distribution[28],
                                UserValue_5_Name = distribution[29],
                                UserValue_5_Value = distribution[30],
                                UserValue_6_Name = distribution[31],
                                UserValue_6_Value = distribution[32],
                                UserValue_7_Name = distribution[33],
                                UserValue_7_Value = distribution[34],
                                UserValue_8_Name = distribution[35],
                                UserValue_8_Value = distribution[36],
                                UserValue_9_Name = distribution[37],
                                UserValue_9_Value = distribution[38],
                                MeasDate = distribution[39],
                                mPR = distribution[40],
                                mZK = distribution[41],
                                mRpe200mA = distribution[42],
                                mRpe10A = distribution[43],
                                mU10A = distribution[44],
                                mRiso500V = distribution[45],
                                mRiso250V = distribution[46],
                                mRiso100V = distribution[47],
                                mRisoIn_W = distribution[48],
                                mRisoW_PE = distribution[49],
                                mRisoIn_PE = distribution[50],
                                mIpe = distribution[51],
                                mIpeInv = distribution[52],
                                mIpeExt = distribution[53],
                                mIdif = distribution[54],
                                mIdifInv = distribution[55],
                                mIdifExt = distribution[56],
                                mId = distribution[57],
                                mIdDif = distribution[58],
                                mIsub = distribution[59],
                                mId_W = distribution[60],
                                mIdDif_W = distribution[61],
                                mP = distribution[62],
                                mPExt = distribution[63],
                                mS = distribution[64],
                                mSExt = distribution[65],
                                mcosPhi = distribution[66],
                                mI = distribution[67],
                                mU = distribution[68],
                                mIExt = distribution[69],
                                mTemp = distribution[70],
                                mRPM = distribution[71],
                                mUo_Vef = distribution[72],
                                mUo_Vpp = distribution[73],
                                mIm_S_n = distribution[74],
                                mIm_P_n = distribution[75],
                                mIm_P_p = distribution[76],
                                mIm_P_pz = distribution[77],
                                MeasInspectionNote = distribution[78],
                                MeasInspectionStatus = distribution[79],
                                MeasFunctTestNote = distribution[80],
                                MeasFunctTestStatus = distribution[81],
                                MeasMeasurementsNote = distribution[82],
                                MeasMeasurementsStatus = distribution[83],
                                MeasGlobalNote = distribution[84],
                                MeasGlobalStatus = distribution[85],
                                InspectorName = distribution[86],
                                InspectorSecondName = distribution[87],
                                InspectorLicense = distribution[88],
                                DeviceSerialNum = distribution[89],
                                DeviceType = distribution[90],
                                DeviceCalibrationNum = distribution[91],
                                DeviceCalibrationExpire = distribution[92],
                                SupplFirm = distribution[93],
                                SupplIC = distribution[94],
                            };

                            Imports.Add(imp);

                            if (names.Add(distribution[0]))
                            {
                                Customer cust = new Customer();
                                cust.NazevFirmy = distribution[0];
                                Customers.Add(cust);
                            }
                            Save();
                            ImportCount = Imports.Count();
                        }
                    }
                }
                catch (Exception ex)
                {
                    WPFMessageBox.Show(ex.Message, "CHYBA!!!", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            else
                WPFMessageBox.Show("Vyprázdněte data!", "CHYBA!!!", MessageBoxButton.OK, MessageBoxImage.Error);
        }
 
Nahoru Odpovědět
20.9.2017 9:25
Avatar
Maros2470
Člen
Avatar
Odpovídá na plelovsky
Maros2470:20.9.2017 10:00

Super, funguje to. Mohl bys mi ještě poradit, jakým způsobem ověřit, zda už databáze neobsahuje stejnou položku?
Bude to aplikace na evidenci zařízení a tak při obnově, nebo přidání nových dat z CSV, by se zákazník mohl v databázi znásobit.

Díky

 
Nahoru Odpovědět
20.9.2017 10:00
Avatar
plelovsky
Člen
Avatar
plelovsky:20.9.2017 10:10

Variant je několik

  1. před každým uložením zákazníka poslat dotaz do DB na jeho existenci a uložit jen pokud neexistuje
  2. před importem načíst všechny zákazníky z DB, pak přidat a uložit jen ty, co ještě neexistují
  3. na úrovni DB zařídit uložení jen pokud neexistuje

Varianta 1 je náročná na čas, varianta 2 na paměť.
Jelikož nakonec požaduješ něco jiného než jsi psal v zadání, tak ta moje úprava nebude ideální.

 
Nahoru Odpovědět
20.9.2017 10:10
Avatar
Maros2470
Člen
Avatar
Odpovídá na plelovsky
Maros2470:20.9.2017 10:22

Co bys tedy doporučil?

 
Nahoru Odpovědět
20.9.2017 10:22
Avatar
plelovsky
Člen
Avatar
plelovsky:20.9.2017 10:45

Pogooglit "entity framework insert if not exists".
Vyzkoušet co bude pro Tvoje účely nejlepší.

 
Nahoru Odpovědět
20.9.2017 10:45
Avatar
Maros2470
Člen
Avatar
Odpovídá na plelovsky
Maros2470:20.9.2017 13:38

Zkusil jsem to takto a zdá se , že to funguje:

var custName = Customers.Where(o => o.NazevFirmy == distribution[0]).Count();

                            Imports.Add(imp);
                            if (custName == 0)
                            {
                                if (names.Add(distribution[0]))
                                {
                                    Customer cust = new Customer();
                                    cust.NazevFirmy = distribution[0];
                                    Customers.Add(cust);
                                }
                            }
                            Save();

Otázka je, zda je to správně?

 
Nahoru Odpovědět
20.9.2017 13:38
Avatar
plelovsky
Člen
Avatar
plelovsky:20.9.2017 14:04

Je to výše zmíněná varianta č. 1.
Pomocný HashSet names v mém návrhu hlídal jedinečnost jména zákazníka v rámci jednoho importu. Když se pokaždé ptáš na existenci zákazníka v DB, tak to není potřeba kontrolovat ještě jinak.

Imports.Add(imp);
var custName = Customers.Where(o => o.NazevFirmy == distribution[0]).Count();
if (custName == 0)
{
    Customer cust = new Customer();
    cust.NazevFirmy = distribution[0];
    Customers.Add(cust);
}
Save();
 
Nahoru Odpovědět
20.9.2017 14:04
Avatar
Maros2470
Člen
Avatar
Odpovídá na plelovsky
Maros2470:20.9.2017 14:06

Díky za rady

 
Nahoru Odpovědět
20.9.2017 14:06
Avatar
plelovsky
Člen
Avatar
plelovsky:20.9.2017 14:08

Lepší by bylo

Imports.Add(imp);
if (!Customers.Any(o => o.NazevFirmy == distribution[0]))
{
    Customer cust = new Customer();
    cust.NazevFirmy = distribution[0];
    Customers.Add(cust);
}
Save();
 
Nahoru Odpovědět
20.9.2017 14:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.