WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   sql problem die zweite (http://www.wcm.at/forum/showthread.php?t=170598)

chefkoch 26.07.2005 12:21

sql problem die zweite
 
also ich steh vor folgendem problem, dass ich gerne wissen möchte in welcher zeile sich ein eintrag befindet. sprich ich will zur zeilen nur von einem bestimmten datensatz kommen damit ich den ändern kann.
es müsst doch so eine funktion geben wie selectedindex bei den dropdownfeld oder?

Juro 26.07.2005 13:43

So wie es sich liest verwendest Du ein Tool, welches denn?

Ansonsten, wenn Du folgende Struktur hast:

tabelle1:
id | name | vorname
1 | Huber | Hans
2 | Muster | Franz
3 ....
...
230 | Miller | Karl
...

findest Du die Zeile mit "Miller":

select * from tabelle1 where id=230

Oder habe ich Deine Frage missverstanden? Wenn ja, kannst Du ein Beispiel schildern?

chefkoch 26.07.2005 14:05

von der struktur passt es so wie du gesagt hast, aber ich brauch zum speichern der änderung von meinem datensatz die zeilen nr in der db. die ist nämlich nicht gleich wie die wertid, da schon manche einträge rausgelöscht wurden, aber nicht nachgefüllt worden sind.

Chefkoch_ico 26.07.2005 14:30

Was ist den das für eine Datenbank, in der man gelöschte "Zeilen" aufüllen muss.

Mit Zeilennummern fängt man normalerweise in keiner Relationalen Datenbank etwas an. Nichtmal in Access.

CU

chefkoch 26.07.2005 15:03

die lücken von der wertid hätten aufgefüllt werden solln und ned einfach gelöscht und die neuen am db ende angefügt.

rem996 26.07.2005 15:17

hm

ich seh das problem nicht.. wenn du ohnehin einen unique schlüssel wie die ID im beispiel hast, kannst du jede zeile darüber identifizieren...

select id
from table
where name like "%mustermann%"

anschliessend

update table set name="neuername" where id = #idvonvorher

was willst du mit der zeile? das hat überhaupt nix mit der zeile zu tun wenn du einen wert updaten willst. schlagt mich nicht wenn das SQL so nicht genau stimmt, hab schon länger kein SQL mehr gebraucht :D

die id werte auffüllen macht ohnehin keinen sinn. die müssen nur unique sein und sind meistens ohnehin eine sequence bzw. auto_increment je nach db

was für eine db ist das überhaupt?

lg
rem996

Chefkoch_ico 26.07.2005 15:39

Gelöschte Primärschlüsselwerte wiederbenutzen verstößt gegen alle Gesetze der sauberen Datenbankprogrammierung.

Der Sinn dahinter bleibt mir schleierhaft. Normalerweise wird ein Primärschlüsselwert nirgends angezeigt, ausser es ist für eine einfache Identifiezierung erforderlich (Kundennummern, Matrikelnummern, Artikelnummern). Und selbst hierbei ists kein Problem, wenn mal ein Nummernloch vorkommt.

Wiederbenutzen gelöschter Werte kann da nur Probleme machen. Stell dir vor, jemand gibt eine Bestellung über eine Artikelnummer auf. Der Artikel wird gelöscht und an seine Stelle tritt ein anderer Artikel mit gleicher ID. Bei erneuter Bestellung würder er was völlig falsches bestellen.

CU

snowman 26.07.2005 22:02

Zitat:

Original geschrieben von Juro
So wie es sich liest verwendest Du ein Tool, welches denn?

So, wie es sich liest, hat er keine Ahnung von Datenbanken.

Also, wenn dein "wertid" eine primärer Schlüssel ist, kannst du damit jeden Datensatz identifizieren und brauchst keine Zeilennummer. ;-(

gruss,
snowman

chefkoch 27.07.2005 07:33

also so schaut mein code im moment aus
damit ändere ich den bestehenden datesatz in der db

int wert = Convert.ToInt32(TextBox1.Text);
DataSet dataSet41 = new DataSet();
SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter("select * from wkonf_tab", sqlConnection1);
SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter1);
sqlDataAdapter1.MissingSchemaAction = MissingSchemaAction.AddWithKey;
sqlDataAdapter1.Fill(dataSet41, "wkonf_tab");
DataRow myDataRow = dataSet41.Tables["wkonf_tab"].Rows[wert];
myDataRow["bez"] = Convert.ToString(TextBox2.Text);
myDataRow["einheit"] = Convert.ToString(TextBox3.Text);
myDataRow["zeiteinheit"]= Convert.ToInt32(TextBox4.Text);
myDataRow["letzte_aenderung_zeitbez"]= Convert.ToInt32(TextBox5.Text);
myDataRow["letzte_aenderung_person_id"]= Convert.ToInt32(TextBox6.Text);
myDataRow["ausserdienststellungszeitbez"]= Convert.ToInt32(TextBox7.Text);
myDataRow["art_id"]= Convert.ToInt32(TextBox8.Text);
myDataRow["interface_id"]= Convert.ToInt32(TextBox9.Text);
sqlDataAdapter1.Update(dataSet41, "wkonf_tab");

@snowman weisst du eine andere methode wie ich das update von meinem datensatz machen kann?

T.dot 27.07.2005 09:04

Hallo!

Du liest aus der Textbox1.Text anscheinend den Zeilenwert aus. Woher kommt dieser?
Ich würde anstatt des Zeilenwertes dort die ID speichern, dann statt:

SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter("select * from wkonf_tab", sqlConnection1);

"SELECT * FROM wkonf_tab WHERE ID=" & Textbox1.Text

schreiben. Dh. du lest nur die zu aktualisierende Zeile aus.

Zum Updaten für die Datarow nimmst du dann einfach die DataRow 0.
DataRow myDataRow = dataSet41.Tables["wkonf_tab"].Rows[0];


Wobei du statt dem ganzen c# zeug ein stinknormales SQL Update Statement machen könntest, aber jeder wie er will.

mfg Thomas

ps: Ich würde andere Namen für die Objekte und Variablen verwenden, sonst kennst dich irgendwann gar nimmer aus. ;)

Biri 27.07.2005 09:40

hi,

warum meinst du, dass du dir zum updaten der daten die zeilennummer des geänderten Datensatzes merken musst?
(ev. hab ich ja irgendwas aus den beiträgen davor nicht ganz verstanden)
wie bereits geschrieben, soll man einen primärschlüssel nicht wiederverwenden, auch wenn der zugehörige DS gelöscht wurde.

ein dataset hat für jede datarow automatisch einen status - "geändert", "gelöscht", "neu hinzugefügt".
beim aufrufen von Update wird autoamtisch die DB upgedatet, du brachst nicht einzelne zeilen upzudaten, der Dataadapter weiß über den status im dataset, was er updaten muss.
wichtig: danach musst du noch "acceptchanges" aufrufen, damit der status im dataset wieder auf "unverändet" gesetzt wird.

wenn es nur darum geht, dass du ein gui zum ändern von datensätzen in deiner appl bereitstellen willst, empfielt es sich sehr, ein datagrid zu verwenden, das reduziert den benötigten code auf sehr wenige zeilen. :)

fg
-hannes

chefkoch 27.07.2005 10:10

die zeilennr hab ich gebraucht, dadurch das ich mein gesamtes dataset neugeladen hab und ned wie jetzt dank der hilfe von thomas nur die eine zeile. hab ich halt wissen müssen wo der datensatz steht.

mein interface is halt so aufgebaut, dass zuerst die einträge von der datenbank in textboxen geladen werden. dort kann der user die einträge dann ändern. mit einem klick auf den ändern button werden die textboxen abgefragt und zurück in die db geschreiben.


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag