Forum: PC-Programmierung C# MYSQL aufruf von SELECT erstellt unendlich viele Zeilen


von Stefan (Gast)


Lesenswert?

Hallo,

ich habe ein Problem, dass beim Aufrufen des Befehls in C# in meiner 
MYSQL Datenbank unendlich viele Zeilen erstellt werden und ich verstehe 
nicht warum. Sobald der Code mtGrid_productionData.DataSource = data 
aufruft geht es los. Ich bekomme für jede erstellt Zeile in Debugmodus 
diese Sachen angezeigt am Output. Exception bekomme ich auch nicht somit 
habe ich keine Ahnung was da passiert!

The thread 0x2170 has exited with code 0 (0x0).
The thread 0x4c8 has exited with code 0 (0x0).
The thread 0x14e8 has exited with code 0 (0x0).
The thread 0x23bc has exited with code 0 (0x0).
The thread 0xacc has exited with code 0 (0x0).
The thread 0x1638 has exited with code 0 (0x0).
The thread 0x218c has exited with code 0 (0x0).
1
private void loadProject()
2
{
3
    try
4
    {
5
        using (MySqlConnection myConn = new MySqlConnection(stringDB))
6
        {
7
            myConn.Open();
8
9
            MySqlDataAdapter myAdapter = new MySqlDataAdapter("SELECT comment FROM " + mtxb_projectNumber.Text + " WHERE template LIKE template", myConn);
10
11
            DataTable data = new DataTable();
12
            myAdapter.Fill(data);
13
14
            if (data.Rows.Count == 0)
15
                MessageBox.Show("No production data available!");
16
            else
17
            {
18
                mtGrid_productionData.DataSource = data;
19
            }
20
        }
21
    }
22
    catch (Exception ex)
23
    {
24
        MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);

So wird meine Tabelle dynamisch erstellt:
1
//Create Tabel fro Data
2
                        using (MySqlCommand cmd = new MySqlCommand("CREATE TABLE IF NOT EXISTS `" + mtxb_projectNumber.Text + "` (" +
3
                                    "`id` INT AUTO_INCREMENT," +
4
                                    "`partnumber` VARCHAR(45)," +
5
                                    "`partname` VARCHAR(45)," +
6
                                    "`value` VARCHAR(45)," +
7
                                    "`mountingTech` VARCHAR(45)," +
8
                                    "`mfgStep` VARCHAR(45), " +
9
                                    "`sequence` VARCHAR(45), " +
10
                                    "`refdes` VARCHAR(45), " +
11
                                    "`Xmm` VARCHAR(45), " +
12
                                    "`Ymm` VARCHAR(45), " +
13
                                    "`side` VARCHAR(45), " +
14
                                    "`rotate` VARCHAR(45), " +
15
                                    "`minForce` VARCHAR(45), " +
16
                                    "`maxForce` VARCHAR(45), " +
17
                                    "`mfgForce` VARCHAR(45), " +
18
                                    "`mfgOK` VARCHAR(45), " +
19
                                    "`comment` LONGTEXT, " +
20
                                    "`template` VARCHAR(45), " +
21
                                    "`serialnumber` VARCHAR(45), " +
22
                                    "`mfgStaffID` VARCHAR(45), " +
23
                                    "PRIMARY KEY(id));", myConn))
24
                        {
25
                            cmd.ExecuteNonQuery();
26
                            cmd.Dispose();
27
                        }

Weis jemand was ich falsch mache? Ich bin ziemlich neu beim Datenbanken 
programmieren, daher habe ich vielleicht nur einen Denkfehler irgendwo!

Gruss Stefan

von amr2100 (Gast)


Lesenswert?

Hallo,
Ich arbeite zwar nicht mit mysql, sondern mit anderen Datenbanken, aber 
ich denke das Problem liegt an der where Bedingung. Hier wird die Spalte 
template mit sich selbst verglichen. Es sollte dann dort der konkrete 
Suchbegriff stehen.
Zb. Where template like "%suchtext%", wobei % ein Wildcardsymbol ist
Noch besser wäre der Einsatz von Variablen

Gruß Anton

von Nase (Gast)


Lesenswert?

Stefan schrieb:
> So wird meine Tabelle dynamisch erstellt:
> //Create Tabel fro Data
>                         using (MySqlCommand cmd = new
> MySqlCommand("CREATE TABLE IF NOT EXISTS `" + mtxb_projectNumber.Text +
> "` (" +
Warum machst du so einen Quatsch?

Ein typisches RDBS hat eher ein Problem mit vielen Tabellen als mit 
großen Tabellen.

von Stefan (Gast)


Lesenswert?

@amr2100
es wird nicht mit sich selbst verglichen, sonder nach dem Wert template 
in der Spalte template gesucht.

@Nase
unter einigen Bedingung muss ich leider eine neu Tabelle erstellen, da 
kommen auch sehr viele Daten rein.

von Carl D. (jcw2)


Lesenswert?

Stefan schrieb:
> @amr2100
> es wird nicht mit sich selbst verglichen, sonder nach dem Wert template
> in der Spalte template gesucht.

Dann würde ich das 2te "template" auch als Literal schreiben.

von c-hater (Gast)


Lesenswert?

Stefan schrieb:

> @amr2100
> es wird nicht mit sich selbst verglichen, sonder nach dem Wert template
> in der Spalte template gesucht.

Ist das bei MySQL wirklich so? Falls ja, wäre es das bescheuertste 
denkbare RDBMS, von dem ich je gehört hätte. Aber das ist ja nix 
wirklich neues...

Jede SQL-DB für Normaldenkende wird jedenfalls diese where-Klausel so 
interpretieren, wie amr2100 geschrieben hat. Trotzdem ist es eine schöne 
Aufgabe zum Vergleich der Query-Optimizer. Nicht jede checkt, dass es 
sich hier um eine redundante Bedingung handelt, die zur Laufzeit der 
Abfrage überhaupt nicht mehr geprüft werden muss. Übrigens: sogar "where 
1=1" behandelt nicht jede RDBMS sinnvoll. Wahrscheinlich haben die 
Entwickler einfach nicht mit der grenzenlosen Idiotie mancher Anwender 
gerechnet...

Was nun das Problem des TO betrifft: Natürlich wird die Abfrage nicht 
"unendlich viele" Zeilen liefern, sondern maximal das "Kreuzprodukt" aus 
den in "mtxb_projectNumber.Text" mit Kommas separiert aufgeführten 
Tabellen.

Das kann allerdings recht groß werden, wenn Dau Dummdödel jede 
verschissene Tabelle in der DB dort aufgelistet hat oder zugelassen hat, 
dass ein Angreifer die Macht dazu hatte. Der kann dann nämlich durchaus 
auch "virtuelle" Tabellen mit einer unendlichen Zahl von Einträgen 
erzeugen.

Ich schätze also mal, dass hier wieder mal ein völlig überforderter 
"WÄBDESIGNER" mit den Realitäten konfrontiert wurde und num wegen seiner 
grenzenlosen Inkompetenz am völlig falschen Ende des Problems 
rumdoktort.

von Nase (Gast)


Lesenswert?

Stefan schrieb:
> @amr2100
> es wird nicht mit sich selbst verglichen, sonder nach dem Wert template
> in der Spalte template gesucht.
Das ist aber nicht so. Wenn du nach "template" suchen willst, dann setz 
es in Anführungszeichen oder mach einen Platzhalter für ein prepared 
statement draus. Oder eine Variable.
So jedenfalls vergleichst du die Spalte mit sich selbst.

>
> @Nase
> unter einigen Bedingung muss ich leider eine neu Tabelle erstellen, da
> kommen auch sehr viele Daten rein.
Dann hast du in 99,9% ein Problem mit der Normalisierung deiner Daten.


c-hater schrieb:
> Ich schätze also mal,
Und ich schätze mal, dass hier wieder mal ein völlig inkompetenter 
c-hater in altbekannter Manier von Dingen faselt, von denen er nicht mal 
ansatzweise Ahnung hat.

von Carl D. (jcw2)


Lesenswert?

> Ist das bei MySQL wirklich so? Falls ja, wäre es das bescheuertste
> denkbare RDBMS, von dem ich je gehört hätte. Aber das ist ja nix
> wirklich neues...

> Jede SQL-DB für Normaldenkende wird jedenfalls diese where-Klausel so
> interpretieren, wie amr2100 geschrieben hat.

Nein, nur "c-hater"-denkende kommen auf die Idee.
Andere erlauben es 2 Felder einer Zeile zu vergleichen.

Welcher Blödsinn wäre es die Eigenschaft "Literal" von der Position 
innerhalb des Ausdrucks abhängig zu machen.

Zudem ist es völlig egal, denn was zählt ist das Ergebnis und das will 
"c-liebend" erzielt werden.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

 WHERE template LIKE template

vergleicht auch in MySQl template mit template, also die Spalte mit sich 
selbst. Kann man auch gleich WHERE 1 = 1 hinschreiben oder den WHERE 
Teil weglassen...

Gruß aus Berlin
Michael

von Nase (Gast)


Lesenswert?

Michael U. schrieb:
> Kann man auch gleich WHERE 1 = 1 hinschreiben oder den WHERE
> Teil weglassen...

Wobei "WHERE 1" in früheren MySQL-Versionen tatsächlich mal für 
Performancegewinn gesorgt hat...

von Carl D. (jcw2)


Lesenswert?

Probier's doch einfach mal so:
1
MySqlDataAdapter myAdapter = new MySqlDataAdapter("SELECT comment FROM " + mtxb_projectNumber.Text + " WHERE template LIKE 'template'", myConn);

SQL erlaubt da freundlicherweise einzelne oder doppelte Hochkommas. Gut 
für die, die C-Strings-Literale so sehr hassen, daß sie "\"" nicht 
interpretieren können.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.