Autor Beitrag
fluffy1234
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 13.01.14 23:38 
Hi Leute,

ich habe eine Methode die eine XML-Datei ausliest, was auch wunderbar funktioniert.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
...
foreach (XmlNode person in xmlLesen.SelectNodes("/Personenliste/Person"))
{
  vorname = person["Vorname"].InnerText;
  nachname = person["Nachname"].InnerText;
  telefon = person["Telefon"].InnerText;
  alter = Convert.ToInt32(person["Alter"].InnerText);
  ort = person["Ort"].InnerText;

  Insert db = new Insert();
  db.sqlInsert(vorname, nachname, alter, telefon, ort);
}
...



Nun habe ich eine zweite Methode wo die Daten in eine Datenbank geschrieben werden. Funktioniert auch. Ich möchte jedoch abprüfen ob die Datenbank vorhanden ist. Was auch funktioniert, jedoch kommen dann die Message.Boxen für jeden Datensatz und ich verstehe nicht wie ich das anders regeln kann. Also das die Message.Boxen nur einmal angezeigt werden...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
....
public void sqlInsert(string vorname, string name, int alter1, string telefon, string ort)
{   
  try
  {
    string connString =  "Server=localhost;Port=3306;Database=personenliste;Uid=root;password=;";
    string sqlcommand = "Insert into person (Vorname, Nachname, Alter1, Telefon, Ort) values('" + vorname + "', '" + name + "', '" + alter1 + "', '" + telefon + "', '" + ort + "')";
    MySqlConnection conn = new MySqlConnection(connString);
    MySqlCommand command = conn.CreateCommand();
    command.CommandText = sqlcommand;

    conn.Open();
    command.ExecuteNonQuery();

    conn.Close();
    MessageBox.Show("Daten wurden eingefügt");
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
...


Grüße
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mo 13.01.14 23:52 
Auf diese weise sind die Messageboxen ja auch quasi in der foreach Schleife.

Falls es dir um die "Daten wurden eingefügt" Box geht: Das hat da eh nichts zu suchen. Wenn keine Exception geworfen wurde, war die Operation erfolgreich - so einfach ist das ;-)
Damit auch schon zur zweiten Box: Hier würde ich einfach die Exception weiterreichen nach oben:
ausblenden C#-Quelltext
1:
2:
3:
4:
  catch (Exception ex)
  {
    throw ex;
  }

und dann um die foreach-Schleife noch ein try-catch drum herum.

P.S.: Strings direkt in die Query einzubauen war schon vor 10 Jahren ganz böse und unsicher :wink:

Falls du es natürlich so haben möchtest, dass spätere Einträge doch in die Datenbank kommen, obwohl vorher eine SQL-Injection stattfand:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Insert db = new Insert();
var ExceptionList = new List<Tuple<Exception, person>>();
foreach (XmlNode person in xmlLesen.SelectNodes("/Personenliste/Person"))
{
  vorname = person["Vorname"].InnerText;
  nachname = person["Nachname"].InnerText;
  telefon = person["Telefon"].InnerText;
  alter = Convert.ToInt32(person["Alter"].InnerText);
  ort = person["Ort"].InnerText;

  try
  {
    db.sqlInsert(vorname, nachname, alter, telefon, ort);
  }
  catch (Exception ex)
  {
  ExceptionList.Add(Tuple<Exception, person>(ex, person));
  }
}
if ExceptionList.Count > 0
  throw new DatabaseAggregateException(ExceptionList);

Dann kannst du nachher in der Liste nachschauen bei welchen Einträgen es Probleme gab.
fluffy1234 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 14.01.14 00:48 
Hi,

danke für die schnelle Antwort. Ich bekomme aber einen Fehler beim ausführen.
Bei der untersten "---> ExceptionList <---" würden () fehlen, ich weiß aber nicht an welcher Selle :D

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
foreach (XmlNode person in xmlLesen.SelectNodes("/Personenliste/Person"))
{
  vorname = person["Vorname"].InnerText;
  nachname = person["Nachname"].InnerText;
  telefon = person["Telefon"].InnerText;
  alter = Convert.ToInt32(person["Alter"].InnerText);
  ort = person["Ort"].InnerText;

 try
 {
   Insert db = new Insert();
   db.sqlInsert(vorname, nachname, alter, telefon, ort);
 }
 catch (Exception ex)
 {
   ExceptionList.Add(Tuple<Exception, person>(ex, person));
 }
}
if ----> ExceptionList[/color].Count > 0 <-----------
  throw new DatabaseAggregateException(ExceptionList);...


bzw. wenn ich if (ExceptionList.Count > 0) mache, bekomme ich noch mehr Fehler angezeigt...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.01.14 01:23 
Zitat:
bzw. wenn ich if (ExceptionList.Count > 0) mache, bekomme ich noch mehr Fehler angezeigt...


Das wäre aber richtig wenn du dann andere Fehlermeldungen bekommst solltest du versuchen diese zu lösen.


Zitat:
ausblenden C#-Quelltext
1:
2:
3:
4:
  catch (Exception ex)
  {
    throw ex;
  }


Ohne das ex nur throw sonst ist der Stacktrace weg.
fluffy1234 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 14.01.14 09:41 
Ich hab ein bisschen rumprobiert aber irgendwie bekomme ich Sie nicht weg.
Hier noch mal mein Code + Fehlermeldungen..

Bzw. geht das nicht irgendwie einfacher, ich will ja eig. nur das die MessageBoxen nur einmal kommen, evtl. ein Befehl um die Foreach-Schleife abzubrechen..?

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;

namespace xmltosql
{
    static class Program
    {
        static string vorname;
        static string nachname;
        static string telefon;
        static int alter;
        static string ort;

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            //Console.ReadKey();
        }

        public static void xmlLesen(string path)
        {

            // die Datei öffenen

            XmlDocument xmlLesen = new XmlDocument();
            //xmlLesen.Load(@"C:/Users/chris/Desktop/SAE_Projekt/testform/Personen.xml");
            if (String.IsNullOrEmpty(path))
            {
                MessageBox.Show("Keine Daten ausgewählt");
            }

            else
            {
                xmlLesen.Load(path);
                //MessageBox.Show("Daten wurden eingefügt");
            }

            Insert db = new Insert();
            var ExceptionList = new List<Tuple<Exception, person>>();
            foreach (XmlNode person in xmlLesen.SelectNodes("/Personenliste/Person"))
            {
                vorname = person["Vorname"].InnerText;
                nachname = person["Nachname"].InnerText;
                telefon = person["Telefon"].InnerText;
                alter = Convert.ToInt32(person["Alter"].InnerText);
                ort = person["Ort"].InnerText;

                try
                {
                    db.sqlInsert(vorname, nachname, alter, telefon, ort);
                }
                catch (Exception ex)
                {
                    ExceptionList.Add(Tuple<Exception, person>(ex, person));
                }
            }
            if (ExceptionList.Count > 0)
               throw new DatabaseAggregateException(ExceptionList);          

        }
    }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            try
            {
                conn.Open();
                command.ExecuteNonQuery();

                conn.Close();
                //MessageBox.Show("Daten wurden eingefügt");

            }

            catch (Exception ex)
            {
                throw ex;
            }
        }


Fehler 1 Der Typ- oder Namespacename 'person' konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\template\Documents\Visual Studio 2013\Projects\xmltosql\testform\Program.cs 50 59 XMLtoSQL

Fehler 2 'System.Tuple<System.Exception,person>' ist ein(e) 'Typ', wird aber wie ein(e) 'Variable' verwendet. C:\Users\template\Documents\Visual Studio 2013\Projects\xmltosql\testform\Program.cs 77 39 XMLtoSQL

Fehler 3 Der Typ- oder Namespacename 'person' konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\template\Documents\Visual Studio 2013\Projects\xmltosql\testform\Program.cs 77 56 XMLtoSQL

Fehler 4 Der Typ- oder Namespacename 'DatabaseAggregateException' konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\template\Documents\Visual Studio 2013\Projects\xmltosql\testform\Program.cs 81 26 XMLtoSQL
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.01.14 11:11 
Die ersten 3 Fehler hängen damit zusammen das du eine Variable wie einen Typen verwendest. person solltest du da wo du die zur Initialisierung einer generischen Klasse verwendest durch den Typ ersetzen. Scheinbar sollte das XmlNode sein.

Und DatabaseAggregateException ist eine Erfindung des Authors des Codebeispiels. Die gibt es nicht du müßtest dir eine entsprechende Exception von Exception noch ableiten und implementieren.
Das Beispiel solltest du auch eher als Vorlage nehmen wie man es machen könnte. Es ist Pseudocode nichts was man einfach nehmen kann und es wird funktionieren. Es sollte dich zum nachdenken über eine entsprechende Lösung (eben sammeln der Exceptions und späteres auswerten) anregen.

Für diesen Beitrag haben gedankt: jfheins
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 14.01.14 14:13 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Die ersten 3 Fehler hängen damit zusammen das du eine Variable wie einen Typen verwendest. person solltest du da wo du die zur Initialisierung einer generischen Klasse verwendest durch den Typ ersetzen. Scheinbar sollte das XmlNode sein.

So ist es, tut mir Leid für den Patzer. Ich habe das auch nur im Browser zusammengetippt...

Da es ja einfach sein sollte, hier mal reduziert ohne die AggregateException:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Insert db = new Insert();
var ExceptionList = new List<Tuple<Exception, XmlNode>>();
foreach (XmlNode person in xmlLesen.SelectNodes("/Personenliste/Person"))
{
  vorname = person["Vorname"].InnerText;
  nachname = person["Nachname"].InnerText;
  telefon = person["Telefon"].InnerText;
  alter = Convert.ToInt32(person["Alter"].InnerText);
  ort = person["Ort"].InnerText;

  try
  {
    db.sqlInsert(vorname, nachname, alter, telefon, ort);
  }
  catch (Exception ex)
  {
    ExceptionList.Add(Tuple.Create(person, ex));
  }
}
if (ExceptionList.Count > 0)
{
  // Einfach
  MessageBox.Show("Bei " + ExceptionList.Count.toString() + " Datensätzen trat ein Fehler auf!");
  // Schön
  var msg = string.Join("\r\n", ExceptionList.Select(x => string.Format("{0} {1}: {2}", x.Item1["Vorname"].InnerText, x.Item1["Nachname"].InnerText, x.Item2.Message)));
  MessageBox.Show(string.Format("Bei {0} Datensätzen trat ein Fehler auf! \r\n\r\n {1}", ExceptionList.Count, msg));
}

Ist aber erneut nicht kompiliert sondern diesmal in Notepad getippt ;)