daten in datenbank eintragen!

  • geschlossen
  • C#

  • Die_Pest
  • 2152 Aufrufe 13 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • daten in datenbank eintragen!

    hi

    ich würde gerne aus einer textbox in einem form einen text in eine sql datenbank eintragen !
    ich hab schon viele artikel gelesen über dieses thema aber verstehen tuh ichs irgendwie immer noch nicht:confused:

    ich würde gerne eine kleine tabelle erstellen mit den spalten "Account" und "IP"
    und in die zeilen unter "Account" den text aus der textbox einfügen!
    hätte vll irgendjemand nen passenden code dafür??

    mfg die_pest
  • Hallo um welche Datenbank handelt es sich denn.
    Access oder SQL-Server.
    Davon hängt ab, wie die Tabelle angelegt wird und wie der Connect-String aussieht.

    Hatte ich die Frage nicht schon mal gepostet?
    Habe ich da vorher was falsch gemacht?
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von wasawasa ()

  • So, hab mal wieder etwas Zeit.
    Das mit der Datenbank ist eigentlich gar nicht so schwer.

    Das ganze basiert übrigens auf ADO.NET.
    Im ersten Schritt einfach mal eine Verbindung aufmachen und wieder zumachen.

    Quellcode

    1. using System.Data;
    2. using System.Data.SqlClient;
    3. using System.Data.OleDb;
    4. .
    5. .
    6. .
    7. String connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = c:\test.mdb";
    8. // Eine neue SqlConnection mit obigem connect String aufmachen
    9. OleDbConnection sqlConn = new OleDbConnection(connectionString);
    10. // Verbinde mit der Datenbank
    11. sqlConn.Open();
    12. // Tu irgend etwas ...
    13. // mach die Verbindung zu
    14. sqlConn.Close();
    Alles anzeigen


    Das macht man über sogenannte "Provider". Davon gibt es (meines Wissens) vier Stück:
    * SqlClient-Provider
    * OleDb-Provider
    * Odbc-Provider
    * Oracle-Provider
    Auf der Basis der Connection, die durch den Provider hergestellt wird, werden später die Datenbankoperationen durchgeführt.
    Ich hab hier mal mit OLEDB gearbeitet, der mir die Verbindung zu einer Access-Datenbank ermöglicht. Du solltest den SqlClient-Provider verwenden, um Dich auf den SQL-Server zu verbinden. Sieht dann so aus:

    Quellcode

    1. using System.Data;
    2. using System.Data.SqlClient;
    3. using System.Data.OleDb;
    4. .
    5. .
    6. .
    7. String connectionString = @"Data Source=(local); Initial Catalog=Datenbankname; Integrated Security=sspi";
    8. // Eine neue SqlConnection mit obigem connect String aufmachen
    9. SqlConnection sqlConn = new SqlConnection(connectionString);
    10. // Verbinde mit der Datenbank
    11. sqlConn.Open();
    12. // Tu irgend etwas ...
    13. // mach die Verbindung zu
    14. sqlConn.Close();
    Alles anzeigen


    Initial Catalog = Hier wird der Name der Datenbank angegeben.
    Integrated Security = Bei sspi werden die aktuellen Anmeldeinformationen des Windows-Kontos für die Authentifizierung verwendet.
    Data Source = Den Default SQL-Server auf Deinem Rechner.

    So jetzt versuche diese Codstückchen auszuführen, ohne dass Dir Exceptions um die Ohren fliegen. Den Rest gibt es danach. Bei Problemen einfach fragen.

    Noch ein Kommentar:
    Im Connect-String von OLEDB steht auch ein Provider. Der ist unabhängig von den oben erwähnten Providern (ADO.NET).
    Ist sozusagen ein Provider vom Provider ...
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von wasawasa ()

  • vielen dank soweit!
    hab des vorhandene erfolgreich eingefügt!
    wie geht es jetzt weiter wenn ich
    2 spalten (1.Account; 2. IP) haben will von denen eine mit nem namen also(in der Spalte Account) und eine mit einer ip adresse (in der spalte IP)
    eingefügen will?

    mfg die_pest
  • Also weiter...

    unter "// Tu irgend etwas ..." werden wir jetzt einen Codeblock einfügen, der Daten in die Datenbank schreibt. Die Tabelle habe ich "Rechner" genannt. Die Spalten haben den Namen "Account" und "IP".

    Für Access:

    Quellcode

    1. OleDbCommand cmd = new OleDbCommand();
    2. cmd.Connection = sqlConn;
    3. cmd.CommandText = @"Select * from Rechner";
    4. DataSet ds = new DataSet();
    5. OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    6. da.FillSchema(ds, SchemaType.Source);
    7. da.Fill(ds);
    8. // Neue Datenzeile hinzufügen
    9. DataRow newRow = ds.Tables[0].NewRow();
    10. newRow['Account'] = "Test";
    11. newRow['IP'] = "100.100.100.100";
    12. ds.Tables[0].Rows.Add(newRow);
    13. OleDbCommandBuilder cmb = new OleDbCommandBuilder(da);
    14. int count = da.Update(ds);
    Alles anzeigen


    Für SQL-Server:

    Quellcode

    1. SqlCommand cmd = new SqlCommand();
    2. cmd.Connection = sqlConn;
    3. cmd.CommandText = @"Select * from Rechner";
    4. DataSet ds = new DataSet();
    5. SqlDataAdapter da = new SqlDataAdapter(cmd);
    6. da.FillSchema(ds, SchemaType.Source);
    7. da.Fill(ds);
    8. // Neue Datenzeile hinzufügen
    9. DataRow newRow = ds.Tables[0].NewRow();
    10. newRow['Account'] = "Test";
    11. newRow['IP'] = "100.100.100.100";
    12. ds.Tables[0].Rows.Add(newRow);
    13. // Hier werden die Daten in die Datenbank verfrachtet
    14. SqlCommandBuilder cmb = new SqlCommandBuilder(da);
    15. int count = da.Update(ds);
    Alles anzeigen


    Wenn man nachher in die Datenbank schaut, sollten die Daten drin sein ...
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...
  • hi ich hab tatsächlich noch ein problem!
    ich hab jetzt versucht eine ip adresse in die spalte ip einzufügen aber es gibt in der liste keinen datentyp der ip unterstützt!
    und ich weiß leider nich wie man welche hinzufügt oder selbermacht!:confused:
    mfg die_pest
  • das funktioniert leider nicht!
    ich hab schon alles ausprobiert es kommt immer ne exception: int 32 erwartet!
    des gibts aber bei mir in den vorlagen nich!
    und ich hab mir auch überlegt einfach nen neuen datentypen hinzuzufügen!
    nur bei mir scheint die funktion "benutzerdefinierten datentypen" hinzufügen
    in "projekt... hinzufügen" nicht installiert zu sein!
    wie kann ich dann einen erstellen?

    mfg die_PEST
  • Welche Zeile wirft denn die Exception?

    Ich habe leider nur Oracle auf meinem System laufen.
    Aber ich wollte mir schon immer mal den SQL-Server anschauen...
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...
  • 1. Prüfe den Typ in der Datenbank.
    2. Kommentiere die Zeile aus und schau nach, ob es nur mit dem Feld "Account" tut.
    3. Schicke es mir mal per PN. Das nachfolgende Debugging dürfte für den Rest des Boards nicht wirklich interessant sein.
    (Und ich bekomme wieder Schläge von den Mods :)).
    4. Sei sparsam mit den PNs ich habe nur 25 frei und schon 20 belegt.

    Hier erst mal noch der Code um IP in Int und zurück zu wandeln.

    Quellcode

    1. int intAddress = BitConverter.ToInt32(System.Net.IPAddress.Parse(address).GetAddressBytes(), 0); // IPv4
    2. string ipAddress = new System.Net.IPAddress(BitConverter.GetBytes(intAddress)).ToString();



    Nun noch zu dem Mapping der Datentypen c# auf CTS:

    Quellcode

    1. byte System.Byte An 8-bits unsigned Value
    2. sbyte System.SByte An 8-bits signed Value
    3. int System.Int32 A 32-bit signed integer
    4. uint System.UInt32 A 32 bit unsigned integer
    5. short System.Int16 A 16-bit signed value
    6. ushort System.UInt16 A 16-bit unsigned value
    7. long System.Int64 A 64-bit signed value
    8. ulong System.UInt64 A 64-bit unsigned value
    9. float System.Single A single precision 32-bit
    10. double System.Double A double precision 64-bit
    11. decimal System.Decimal A 96-bit decimal value
    12. bool System.Boolean true and false
    13. char System.Char A single 16-bit character
    Alles anzeigen


    Und wenn man sich noch das Typsystem vom SQL-Server anschaut:
    msdn.microsoft.com/en-us/library/bb386947.aspx
    (Man bemerke - kein direkter Download-Link!)

    Jetzt sollte es möglich sein im SQL-Sevrer Tabellen anzulegen und das Mapping auf C# zu ermitteln.

    Ein INT in der Datenbank mappt also (verlustfrei) auf einen INT64 in der CLR.
    Dann nimmt man einen "long" in C#.


    Die Konverter als "Long" sehen so aus.

    Quellcode

    1. long longAddress = BitConverter.ToInt32(System.Net.IPAddress.Parse(address).GetAddressBytes(), 0); // IPv4
    2. string ipAddress = new System.Net.IPAddress(BitConverter.GetBytes(System.Convert.ToInt32(longAddress))).ToString();


    Sollte also mit einem "INT" in der Datenbank funktionieren.

    Noch ein Nachtrag zum SQL-Server.
    In meinem Beispiel haben ich zur Authentifizierung den Parameter "Integrated Security=sspi" angegeben.
    Damit versucht der SQL-Server über die Windows-Authentifizierung zu gehen. Sollte er noicht so konfiguriert sein,
    muss man sich über die SQL-Server eigene Userliste anmelden. Das geht dann so:

    Quellcode

    1. String connectionString = @"Data Source=(local); Initial Catalog=Datenbankname;" +
    2. "User ID=Testuser; Password=Test";
    3. // Eine neue SqlConnection mit obigem connect String aufmachen
    4. SqlConnection sqlConn = new SqlConnection(connectionString);
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 26 mal editiert, zuletzt von wasawasa ()

  • da diese probleme jetzt geklehrt sind....hätte ich noch eine weitere frage!
    wie kann man nun,wenn man schon eine zeile gefüllt hat,verhindern, dass nicht zb 2 mal der gleiche name oder die gleiche ip eingetragen werden können?

    also dass eine fehlermeldung kommt, wenn jemand versucht 2 mal das gleiche in eine spalte zu schreiben?

    freu mich wie immer über hilfe;)

    mfg die_pest

    noch eine anmerkung zu wasas beitrag:

    1) wenn ein benutzer zum ersten mal einen account erstellt wir benutzername + ip in eine zeile geschriebn!

    für die restlichen:

    wenn ein benutzer das programm beendet und beim nächsten start eine andere ip hat wird diese während das hauptfenster geladen wird, in die datenbank eingetragen (und zwar auch in die gleiche zeile!);

    der benutzer kann leicht seinen account ändern!
    wenn er dies tut soll der benutzername in der gleichen zeile überschrieben werden!
    falls sich wieder die ip geändert hat soll auch diese überschrieben werden also keine neue zeile angelegt werden!

    hoffe ich hab alles wichtige zusammengefasst:)

    mfg die_pest

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Die_Pest ()

  • Kommt jetz darauf an.
    Du hast einen Namen und eine IP in Deiner Datenbank.
    Jetzt kommt so etwas wie eine fachliche Anforderung ins Spiel.
    Welche Fälle können vorkommen:
    1. Weder IP noch Rechnername ist in der Datenbank
    2. Die IP ist in der Dantenbank der Rechnername aber nicht
    3. Der Rechnername ist in der Datenbank, die IP aber nicht
    4. Beides ist in der Datenbank und in einem Datensatz
    5. Beides ist in der Datenbank, aber in verschiedenen Datensätzen

    Nun muss festgelegt werden, was zu tun ist:
    1. Klar - wir tragen den neuen Satz ein.
    2. Z.B. DHCP hat die IP an einen anderen Rechner vergeben.
    Update des Rechnernamens?
    3. Der Rechner ist bekannt, hat aber eine andere IP (z.B. DHCP).
    Was tun? Ich würde sagen: Die neue IP-Adresse eintragen.
    4. Auch klar - den kennen wir schon.
    5. Wie bei 2 und 3. Der eine ne neue IP. Der Andere einen neuen Namen

    Hier der Code mit dem sich ein bestehender Satz finden und ändern lässt:

    Quellcode

    1. // Verbinde mit der Datenbank
    2. sqlConn.Open();
    3. SqlCommand cmd = new SqlCommand();
    4. cmd.Connection = sqlConn;
    5. cmd.CommandText = @"Select * from Rechner";
    6. DataSet ds = new DataSet();
    7. SqlDataAdapter da = new SqlDataAdapter(cmd);
    8. da.FillSchema(ds, SchemaType.Source);
    9. da.Fill(ds);
    10. // Datenzeile ändern
    11. DataRow[] editRow = ds.Tables[0].Select("Account='Test'");
    12. if (editRow.Length == 1)
    13. {
    14. editRow[0].BeginEdit();
    15. editRow[0]['IP'] = "10.10.10.10";
    16. editRow[0].EndEdit();
    17. }
    18. else
    19. {
    20. // Nichts gefunden
    21. // Oder mehr als einen Eintrag
    22. }
    23. // Hier werden die Daten in die Datenbank verfrachtet
    24. SqlCommandBuilder cmb = new SqlCommandBuilder(da);
    25. int count = da.Update(ds);
    26. // mach die Verbindung zu
    27. sqlConn.Close();
    Alles anzeigen


    Die Zeile "DataRow[] editRow = ds.Tables[0].Select("Account='Test'");"
    sucht in der Datenbank nach dem Vorkommen von "Test".

    Die Zeile "if (editRow.Length == 1)"
    prüft, ob ein (genau ein) Eintrag gefunden wurde. Sollte die Spalte Account
    mehr als einen identischen Eintrag besitzen ist das Ergebnis natürlich auch nicht "1"
    Es muss also irgendwie verhindert werden, dass ein Name mehr als einmal in
    der Datenbank zu finden ist. (Nicht nur wegen der Abfrage, sondern weil es
    für die Anwendung keinen Sinn macht)
    Das kann man selbst machen (im Programm), oder man kann es die Datenbank
    für sich machen lassen.
    Dazu gibt es in der Datenbank Attribute, die man den Spalten geben kann.

    Folgende Vorgehensweise:
    Eine Spalte bekommt das Attribut "Indiziert - ohne Duplikate". Das führt
    zu einer Exception, wenn versucht wird einen Wert doppelt einzufügen.

    Das hat den klaren Vorteil, dass die Datenbank selbst dafür sorgt keine
    Duplikate zu enthalten.

    Das Schlüsselwort "Indiziert" hat aber noch andere Konsequenzen.
    Dazu später mehr.
    Erst mal das zum Laufen bringen :)


    Codebeispiele folgen ...
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von wasawasa ()