C# Wie speichere Eingabe aus Textbox in der Datenbank

coulio

Cadet 2nd Year
Registriert
Juni 2014
Beiträge
31
Hallo,
die Frage ist bestimmt einfach :(

Ich möchte ermöglichen, dass der user einige Daten auf TextBox schreibt. nachdem er den Button "fertig" geklickt hat, sollte seine Daten in der Datenbank gespeichert werden. und das gleiche gilt für das Datum und Zeit (aso DateTime aso ttmmyyyy hhmmss)

Folgende Code habe ich.

Code:
using System.Windows.Forms;
using MySql.Data.MySqlClient;
private void Daten_speichen_Click(object sender, EventArgs e)
        {
               try
                {
      
                  MySqlConnection conn = new MySqlConnection(MyConnectionString);
                  MySqlCommand command = conn.CreateCommand();
                    
               
                 command.CommandText = "INSERT INTO `bestellung`(`Cat_nr`, `book_nr`, `menge`, `datum`) VALUES (@catnr, @book_nr, @menge, @datum)";
                 conn.Open();
                 command.Parameters.AddWithValue("@cat_nr", txbcatnr.Text);
                 command.Parameters.AddWithValue("@book_nr", txbbooknr.Text);
                 command.Parameters.AddWithValue("@menge", txbMenge.Text);
                 //command.Parameters.AddWithValue("@datum", System.Data.SqlDbType.DateTime).Value);
                 
                 
                 command.ExecuteNonQuery();
             }
                   
             catch (MySqlException ex) 
            {
                 MessageBox.Show(ex.Message);
            }



             }

Leider kommt immer dieses "fatal error" von der Exception.

Was mache ich bitte falsch und wie sollte ich auch das Datum in der Datenbank speichern.

Ich benutze ja windowsform und arbeite mit Mysql. ich dachte ich könnte die Funktion now() auch verwenden, geht auch nicht.

danke im voraus
 
Zuletzt bearbeitet:
Code:
 command.CommandText = "INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES (@catnr, @book_nr, @menge, @datum)";

Tabellennamen und Attributsnamen werden nicht in hochkommatas geschrieben.
 
Danke für die Schnelle Antwort, habe gde diese hochkommatas weg genommen, trotzdemm erscheint diese fehler Meldung:
"fatal error encountered during command execution"

Ich dachte der Fehler wäre weil ich 4 Werte verlange und trotzdem das Datum auskommentiert habe, aber nachdem ich Datum rausgeholt habe, kommt immer die gleiche Fehlermeldung:
fatal error encountered during command execution
 
Noch eine andere Frage, was hindert dich daran die Variablen direkt in das Kommando einzufügen?

a la

Code:
string cmd;
cmd = String.format("INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES ({0}, {1}, {2}, '{3}')".format(txbcatnr.Text, txbbooknr.Text, txbMenge.Text, System.Data.SqlDbType.DateTime))
 
Die Exception hat bestimmt noch mehr zu bieten als nur den Fehlertext, schau mal im Debugger rein.
 
crafti5 schrieb:
Code:
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = String.format("INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES ({0}, {1}, {2}, '{3}')".format(txbcatnr.Text, txbbooknr.Text, txbMenge.Text, System.Data.SqlDbType.DateTime))

 cmd.CommandType = CommandType.Text;
 cmd.Connection = conn;

Stimmt, so einfach wollte ich auch vorgehen. Leider kam ich nicht zu diesem Format.

jetzt bekomme ich diesen Fehler, was könnte es bedeuten?

Auf den Member "string.Format(string, object, object, object)" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen

Diese Schreibweise wird irgendwie auch nicht anerkannt
)".format(txbcatnr.Text, txbbooknr.Text, txbMenge.Text, System.Data.SqlDbType.DateTime))"
 
Zuletzt bearbeitet:
oh man sorry, war bei irgendwie noch bei python :)

Code:
cmd.CommandText = String.format("INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES ({0}, {1}, {2}, '{3}')",txbcatnr.Text, txbbooknr.Text, txbMenge.Text, System.Data.SqlDbType.DateTime)

Das sollte jetzt funktionieren
 
danke, funktionniert sehr gut.
Habe auch den Fehler bei den anderen Code gefunden. Das war sehr doof von mir. Alle Spalten stimmten nicht mit in der Datenbank :(

das einzige Problem jetzt ist:

Cat_nr book_nr menge datum
1 16 12 0000-00-00 00:00:00


Wie schaffe ich es mit der Speicherung der genau zeit (Datum und Uhr)?
Die Spalte Datum ist mit der Type Datetime gekennzeichnet.
In meinem PHP admin ist zu sehen: (4 datum datetime Nein kein(e) Bearbeiten Bearbeiten)

LG
 
Zuletzt bearbeitet:
Ging auch nicht.

aber ich habe die Lösung gefungen.

Anstatt

Code:
System.Data.SqlDbType.DateTime

habe ich

Code:
cmd.CommandText = String.format("INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES ({0}, {1}, {2}, '{3}')",txbcatnr.Text, txbbooknr.Text, txbMenge.Text, DateTime.Now)

verwendet und das funktioniert super.
 
coulio schrieb:
Ging auch nicht.

aber ich habe die Lösung gefungen.

Anstatt

Code:
System.Data.SqlDbType.DateTime

habe ich

Code:
cmd.CommandText = String.format("INSERT INTO bestellung(Cat_nr, book_nr, menge, datum) VALUES ({0}, {1}, {2}, '{3}')",txbcatnr.Text, txbbooknr.Text, txbMenge.Text, DateTime.Now)

verwendet und das funktioniert super.

Wow, dein Code schreit regelrecht nach SQL Injections durch das direkte Verwenden von Variablen innerhalb eines SQL queries. Du solltest das Thema wirklich ernst nehmen und keinesfalls vernachlässigen. Wenn du einen parameterisierten Query verwendest, d.h. du gibst im Query nur Platzhalter an die du dann später mit richtigen Werten ersetzt, parsed die (My)SQL-Engine in diesem Fall auch direkt die Werte und entfernt alles was dort nicht hingehört - womit dann eine erfolgreiche SQL Injection abgewendet ist. Siehe http://stackoverflow.com/a/681600/2690438 - passend dazu ebenfalls eher auf eine humoristische Art http://xkcd.com/327/.


Wenn du nun noch einen Schritt weiter gehst und dir dein Leben erleichtern möchtest verwendest du ein ORM wie z.B. Entity Framework, NHibernate, Telerik OpenData (und und und...) oder eher leichtgewichtigere Frameworks with Dapper.NET. Mit diesen Frameworks brauchst du dich dann so gut wie nicht mehr um die Queries kümmern (es sei denn du feuerst wirklich gewollt Raw Queries ab oder verwendest eben Dapper.NET) und arbeitest eben typen-sicher mit normalen C# Objekten und Klassen. Es lohnt sich wirklich einmal ein Auge darauf zu werfen.
 
wow das war mir noch nicht klar gewesen.

Danke, ich werde darauf achten
 
Zurück
Oben