Laden...

DataSet UND DataReader für UPDATE?

Erstellt von Deletemaster vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.608 Views
Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren
DataSet UND DataReader für UPDATE?

Hallo wieder einmal zusammen,
ich hole mir alle Informationen zu einem bestimmten Datensatz
diese Informationen werden mittels DataReader in die vorgesehenen Textfelder geladen.

um nach dem modifizieren der Daten ein UPDATE durchführen zu können benötige ich doch ein DataSet und einen DataAdapter
wie kann ich nun das DataSet mit den Informationen die mir der Reader bereitstellt füllen?

um anschließend das UPDATE mittels
if(dataset.HasChanges)
{
dataadapter.Update(ds, "[tabelle"]);
}

Hier mein Connection-Schnipsel:

Code:

private void DatenSatz_Suchen()
{
try
{
	conn.Open();
such_vrn = txt_vrn.Text;

string SQL = "SELECT * FROM [table] WHERE vrn='" + such_vrn +"' ";
OdbcCommand cmd = new OdbcCommand(SQL, conn);
OdbcDataReader reader = cmd.ExecuteReader();

       // Hier sollte der Adapter und das DataSet generiert werden,
       // um die angezeigten Informationen verändern und
       // per Update zurückschreiben zu können		

while(reader.Read())
{
txt_Vorname.Text	+= reader["Vorname"];
txt_Nachname.Text	+= reader["Nachname"];
txt_Strasse.Text        += reader["Straße"];
txt_PLZ.Text	+= reader["PLZ"];
txt_Ort.Text               += reader["Ort"];
txt_Vorwahl.Text	+= reader["Vorwahl"];
txt_Telefon.Text	+= reader["Telefon"];
}
	reader.Close();
	conn.Close();
	Datumsformate_Fuellen();
}
	catch(Exception ex)
	{
	 MessageBox.Show(ex.Message);
	}				
conn.Close();
}

oder gibt es eine einfachere Lösung?
Danke für Eure Hilfe

6.862 Beiträge seit 2003
vor 18 Jahren

Und warum verwendest du überhaut den DataReader? Kannst doch gleich mitm DataSet arbeiten und DataBinding verwenden.

Baka wa shinanakya naoranai.

Mein XING Profil.

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

ich habe mir die Daten nach meiner bisher bekannten und "erprobten" Weise darstellen lassen.
Jetzt suche ich nach einer möglichst kurzen Möglichkeit die Methode zu erweitern.
Ist es denn möglich, zusätzlich einen Adapter und DataSet zu konfigurieren und den Inhalt det TextBoxen anzubinden?
Danke für die Antwort.

Ich versuch es ansatzweise so:

da = new OdbcDataAdapter("SELECT * FROM winners49 WHERE vrn='" + such_vrn +" ' ", conn);
OdbcCommandBuilder cb = new OdbcCommandBuilder(da);
		
DataSet ds = new DataSet();

txt_Vorname.DataBindings ["vorname"].ToString();

aber irgendwie komme ich mit dem Binding nicht so richtig klar
Kannst du mir bitte ein Beispiel zeigen?
Danke

6.862 Beiträge seit 2003
vor 18 Jahren

Die MSDN ist wie immer dein Freund und Helfer 😄Hier ist ein Beispiel in C# wo 4 Textboxen und ein DateTimePicker an ein DataSet angebunden werden.

Baka wa shinanakya naoranai.

Mein XING Profil.

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

Ja ich war auf Suche und habe etwas gefunden:

txt_Vorname.DataBindings.Add(new Binding ("vorname", ds, "winners49.vorname"));

"Der Obejektverweis wurde nicht auf eine Objektinstanz festgelegt"

was habe ich hier vergessen?
Danke

6.862 Beiträge seit 2003
vor 18 Jahren

Kann sein das deine Textbox oder das DataSet null sind? (Einfach im Debugger wenn der dort anhält mit der Maus über die entsprechende Variable fahren, dann zeigt er ja den Inhalt an)

Baka wa shinanakya naoranai.

Mein XING Profil.

D
155 Beiträge seit 2005
vor 18 Jahren

Das liegt daran, dass "vorname" KEINE EIGENSCHAFT von einer Textbox ist (es sei denn du nutzt eine eigene abgeleitete Textbox mit der Eigenschaft vorname)

txtmy.DataBindings.Add(new DataBinding("Text", MyDataTable, "vorname"));

Gruß Christian

-> An "Text" muss gebunden werden. Bei DateTimePicker an "Value"

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

txt_Vorname.DataBindings.Add(new DataBinding("Text", winners49, "vorname"));

"Der Typ oder Namespace DataBinding konnte nicht gefunden werden"... ?

im Kontexmenue wird auch bei "new" kein DataBinding "angeboten" nur DataCloumn

winners49 bekomme ich die Meldung:
... der Name winners49 steht nicht in der Klasse oder Namespace...
das ist aber die Tabelle auf die ich zugreife...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren
Fast geschafft

So ich denke "syntaktisch" richtig:

DataTable winners49 = ds.Tables["winners49"];

txt_Vorname.DataBindings.Add("Text", winners49,"nachname");

Jetzt bekomme ich die Meldung:
Wert darf nicht NULL sein!
der Wert in der Tabelle ist 100%ig nicht NULL !
Wo liegt hier jetzt bitte der Fehler?

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren
1. Problem gelöst!
da = new OdbcDataAdapter("SELECT * FROM winners49 WHERE vrn='" + such_vrn +" ' ", conn);
OdbcCommandBuilder cb = new OdbcCommandBuilder(da);
						
DataSet ds = new DataSet();

da.Fill(ds, "winners49");
conn.Close();

DataTable dt = ds.Tables["winners49"];

cb_anrede.DataBindings.Add("Text", dt, "anrede");
txt_Vorname.DataBindings.Add("Text", dt,"vorname");
txt_Nachname.DataBindings.Add("Text", dt, "nachname");

Beim Füllen der Textboxen mit Datumswerten erhalte ich folgende Fehlermeldung:

Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden.

wenn die Felder aber leer/Null sind müssen sie doch trotzdem angezeigt werden?

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Deletemaster,

Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden.

Ist genau Dein Problem. Soll heißen, dass Du höchstwahrscheinlich ein 'Convert.ToDateTime()' oder ein 'DateTime.Parse()' durchführst.

Um diese Wandlung herum musst Du eine If-Abfrage setzen, die überprüft, ob das aktuell zu wandelnde Datum (hier meine ich Datenitem, und nicht Kalenderdatum!) gleich 'DBNull.Value' ist, denn ansonsten erhälst Du diese Fehlermeldung.

Was anstatt angezeigt werden soll, kannst Du ja in der Else-Verzweigung festlegen...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

OK ist ja erstmal ne Hilfe...

kannst du mir vielleicht anhand meines Beispiels ne Lösung zeigen?
Danke
mein Code:

OdbcCommand cmdAbschlussdatum = new OdbcCommand(
"SELECT Abschlussdatum FROM winners49 WHERE vrn='" + such_vrn +"' ", conn);
//
DateTime _Abschlussdatum = Convert.ToDateTime(cmdAbschlussdatum.ExecuteScalar());
		
if( _Abschlussdatum = DBNull.Value                    )
	{
	txt_Abschlussdatum.Text = Convert.ToString(_Abschlussdatum.ToString("dd.MM.yyyy")).ToString(); //("ddd, d.MMMM yyyy") zeigt den Wochentag mit an
	}
else
{
	txt_Abschlussdatum.Text = "";
}
4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Deletemaster,

gerne, bei einem so kurzen Beispiel 😉



OdbcCommand cmdAbschlussdatum = new OdbcCommand(
"SELECT Abschlussdatum FROM winners49 WHERE vrn='" + such_vrn +"' ", conn);

// ...

object tmpObjekt = cmdAbschlussdatum.ExecuteScalar();
        
if( tmpObject is DateTime )
    {
    DateTime _Abschlussdatum = Convert.ToDateTime(tmpObjekt);
    txt_Abschlussdatum.Text = Convert.ToString(_Abschlussdatum.ToString("dd.MM.yyyy")).ToString(); //("ddd, d.MMMM yyyy");
    }
else
{
    txt_Abschlussdatum.Text = "unbekanntes Datumsformat oder kein Datum angegeben";
}


Viel Spaß damit 😉
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren
Danke super!

hast du vielleicht auch ne Lösung für mein Problem in einem anderen
http://www.mycsharp.de/wbb2/thread.php?threadid=13951