daten in datenbank eintragen! geschlossen 

Status
Für weitere Antworten geschlossen.

Die_Pest

Registered +
Registriert
Apr. 2007
Beiträge
141
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?
 
Zuletzt bearbeitet von einem Moderator:
hey wasa:D

ne du hast auf was anderes geantwortet!;)
und auf deine frage zurückzukommen... ich meinte wie ich aber oben schon erwähnt hatte einen sql server !!
sry war vll ein wenig undurchsichtig!

mfg die_pest
 
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.

Code:
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
.
.
.
String connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = c:\test.mdb";
// Eine neue SqlConnection mit obigem connect String aufmachen
OleDbConnection sqlConn = new OleDbConnection(connectionString);
// Verbinde mit der Datenbank
sqlConn.Open();
// Tu irgend etwas ...

// mach die Verbindung zu
sqlConn.Close();

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:

Code:
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
.
.
.
String connectionString = @"Data Source=(local); Initial Catalog=Datenbankname; Integrated Security=sspi";
// Eine neue SqlConnection mit obigem connect String aufmachen
SqlConnection sqlConn = new SqlConnection(connectionString);
// Verbinde mit der Datenbank
sqlConn.Open();
// Tu irgend etwas ...

// mach die Verbindung zu
sqlConn.Close();

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 ...
 
Zuletzt bearbeitet von einem Moderator:
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:
Code:
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = sqlConn;
cmd.CommandText = @"Select * from Rechner";
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);

// Neue Datenzeile hinzufügen 
DataRow newRow = ds.Tables[0].NewRow();
newRow['Account'] = "Test";
newRow['IP'] = "100.100.100.100";
ds.Tables[0].Rows.Add(newRow);

OleDbCommandBuilder cmb = new OleDbCommandBuilder(da); 
int count = da.Update(ds);

Für SQL-Server:
Code:
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConn;
cmd.CommandText = @"Select * from Rechner";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);

// Neue Datenzeile hinzufügen 
DataRow newRow = ds.Tables[0].NewRow();
newRow['Account'] = "Test";
newRow['IP'] = "100.100.100.100";
ds.Tables[0].Rows.Add(newRow);

// Hier werden die Daten in die Datenbank verfrachtet
SqlCommandBuilder cmb = new SqlCommandBuilder(da); 
int count = da.Update(ds);

Wenn man nachher in die Datenbank schaut, sollten die Daten drin sein ...
 
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
 
Da würde ich einfach mal ein Textfeld nehmen.
Das sollte für die Belange ausreichen.
 
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...
 
diese zeile:

newRow['IP'] = ip;


da kommt dan ne format exception mit erwartetes format: int32!!
aber des kann man nich einstellen :confused:

mfg
 
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.

Code:
int intAddress = BitConverter.ToInt32(System.Net.IPAddress.Parse(address).GetAddressBytes(), 0); // IPv4

string ipAddress = new System.Net.IPAddress(BitConverter.GetBytes(intAddress)).ToString();


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

Code:
byte System.Byte An 8-bits unsigned Value
sbyte System.SByte An 8-bits signed Value
int System.Int32 A 32-bit signed integer
uint System.UInt32 A 32 bit unsigned integer
short System.Int16 A 16-bit signed value
ushort System.UInt16 A 16-bit unsigned value
long System.Int64 A 64-bit signed value
ulong System.UInt64 A 64-bit unsigned value
float System.Single A single precision 32-bit
double System.Double A double precision 64-bit
decimal System.Decimal A 96-bit decimal value
bool System.Boolean true and false
char System.Char A single 16-bit character

Und wenn man sich noch das Typsystem vom SQL-Server anschaut:
http://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.

Code:
long longAddress = BitConverter.ToInt32(System.Net.IPAddress.Parse(address).GetAddressBytes(), 0); // IPv4

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:

Code:
String connectionString = @"Data Source=(local); Initial Catalog=Datenbankname;" +
"User ID=Testuser; Password=Test";
// Eine neue SqlConnection mit obigem connect String aufmachen
SqlConnection sqlConn = new SqlConnection(connectionString);
 
Zuletzt bearbeitet von einem Moderator:
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
 
Zuletzt bearbeitet von einem Moderator:
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:

Code:
// Verbinde mit der Datenbank
sqlConn.Open();

SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConn;
cmd.CommandText = @"Select * from Rechner";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);

// Datenzeile ändern 
DataRow[] editRow = ds.Tables[0].Select("Account='Test'");
if (editRow.Length == 1)
{
editRow[0].BeginEdit();
editRow[0]['IP'] = "10.10.10.10";
editRow[0].EndEdit();
}
else
{
// Nichts gefunden
// Oder mehr als einen Eintrag
}

// Hier werden die Daten in die Datenbank verfrachtet
SqlCommandBuilder cmb = new SqlCommandBuilder(da); 
int count = da.Update(ds);

// mach die Verbindung zu
sqlConn.Close();

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 ...
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten